//===----------------------------------------------------------------------===//
//
// This source file is part of the Soto for AWS open source project
//
// Copyright (c) 2017-2024 the Soto project authors
// Licensed under Apache License v2.0
//
// See LICENSE.txt for license information
// See CONTRIBUTORS.txt for the list of Soto project authors
//
// SPDX-License-Identifier: Apache-2.0
//
//===----------------------------------------------------------------------===//

// THIS FILE IS AUTOMATICALLY GENERATED by https://github.com/soto-project/soto-codegenerator.
// DO NOT EDIT.

#if canImport(FoundationEssentials)
import FoundationEssentials
#else
import Foundation
#endif
@_exported import SotoCore

/// Service object for interacting with AWS AppSync service.
///
/// AppSync provides API actions for creating and interacting with data sources using GraphQL from your application.
public struct AppSync: AWSService {
    // MARK: Member variables

    /// Client used for communication with AWS
    public let client: AWSClient
    /// Service configuration
    public let config: AWSServiceConfig

    // MARK: Initialization

    /// Initialize the AppSync client
    /// - parameters:
    ///     - client: AWSClient used to process requests
    ///     - region: Region of server you want to communicate with. This will override the partition parameter.
    ///     - partition: AWS partition where service resides, standard (.aws), china (.awscn), government (.awsusgov).
    ///     - endpoint: Custom endpoint URL to use instead of standard AWS servers
    ///     - middleware: Middleware chain used to edit requests before they are sent and responses before they are decoded 
    ///     - timeout: Timeout value for HTTP requests
    ///     - byteBufferAllocator: Allocator for ByteBuffers
    ///     - options: Service options
    public init(
        client: AWSClient,
        region: SotoCore.Region? = nil,
        partition: AWSPartition = .aws,
        endpoint: String? = nil,
        middleware: AWSMiddlewareProtocol? = nil,
        timeout: TimeAmount? = nil,
        byteBufferAllocator: ByteBufferAllocator = ByteBufferAllocator(),
        options: AWSServiceConfig.Options = []
    ) {
        self.client = client
        self.config = AWSServiceConfig(
            region: region,
            partition: region?.partition ?? partition,
            serviceName: "AppSync",
            serviceIdentifier: "appsync",
            serviceProtocol: .restjson,
            apiVersion: "2017-07-25",
            endpoint: endpoint,
            variantEndpoints: Self.variantEndpoints,
            errorType: AppSyncErrorType.self,
            xmlNamespace: "http://appsync.amazonaws.com",
            middleware: middleware,
            timeout: timeout,
            byteBufferAllocator: byteBufferAllocator,
            options: options
        )
    }




    /// FIPS and dualstack endpoints
    static var variantEndpoints: [EndpointVariantType: AWSServiceConfig.EndpointVariant] {[
        [.dualstack]: .init(endpoints: [
            "af-south-1": "appsync.af-south-1.api.aws",
            "ap-east-1": "appsync.ap-east-1.api.aws",
            "ap-northeast-1": "appsync.ap-northeast-1.api.aws",
            "ap-northeast-2": "appsync.ap-northeast-2.api.aws",
            "ap-northeast-3": "appsync.ap-northeast-3.api.aws",
            "ap-south-1": "appsync.ap-south-1.api.aws",
            "ap-south-2": "appsync.ap-south-2.api.aws",
            "ap-southeast-1": "appsync.ap-southeast-1.api.aws",
            "ap-southeast-2": "appsync.ap-southeast-2.api.aws",
            "ap-southeast-3": "appsync.ap-southeast-3.api.aws",
            "ap-southeast-4": "appsync.ap-southeast-4.api.aws",
            "ca-central-1": "appsync.ca-central-1.api.aws",
            "cn-north-1": "appsync.cn-north-1.api.amazonwebservices.com.cn",
            "cn-northwest-1": "appsync.cn-northwest-1.api.amazonwebservices.com.cn",
            "eu-central-1": "appsync.eu-central-1.api.aws",
            "eu-central-2": "appsync.eu-central-2.api.aws",
            "eu-north-1": "appsync.eu-north-1.api.aws",
            "eu-south-1": "appsync.eu-south-1.api.aws",
            "eu-south-2": "appsync.eu-south-2.api.aws",
            "eu-west-1": "appsync.eu-west-1.api.aws",
            "eu-west-2": "appsync.eu-west-2.api.aws",
            "eu-west-3": "appsync.eu-west-3.api.aws",
            "il-central-1": "appsync.il-central-1.api.aws",
            "me-central-1": "appsync.me-central-1.api.aws",
            "me-south-1": "appsync.me-south-1.api.aws",
            "sa-east-1": "appsync.sa-east-1.api.aws",
            "us-east-1": "appsync.us-east-1.api.aws",
            "us-east-2": "appsync.us-east-2.api.aws",
            "us-west-1": "appsync.us-west-1.api.aws",
            "us-west-2": "appsync.us-west-2.api.aws"
        ])
    ]}

    // MARK: API Calls

    /// Maps an endpoint to your custom domain.
    @Sendable
    @inlinable
    public func associateApi(_ input: AssociateApiRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> AssociateApiResponse {
        try await self.client.execute(
            operation: "AssociateApi", 
            path: "/v1/domainnames/{domainName}/apiassociation", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Maps an endpoint to your custom domain.
    ///
    /// Parameters:
    ///   - apiId: The API ID. Private APIs can not be associated with custom domains.
    ///   - domainName: The domain name.
    ///   - logger: Logger use during operation
    @inlinable
    public func associateApi(
        apiId: String,
        domainName: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> AssociateApiResponse {
        let input = AssociateApiRequest(
            apiId: apiId, 
            domainName: domainName
        )
        return try await self.associateApi(input, logger: logger)
    }

    /// Creates an association between a Merged API and source API using the source API's identifier.
    @Sendable
    @inlinable
    public func associateMergedGraphqlApi(_ input: AssociateMergedGraphqlApiRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> AssociateMergedGraphqlApiResponse {
        try await self.client.execute(
            operation: "AssociateMergedGraphqlApi", 
            path: "/v1/sourceApis/{sourceApiIdentifier}/mergedApiAssociations", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Creates an association between a Merged API and source API using the source API's identifier.
    ///
    /// Parameters:
    ///   - description: The description field.
    ///   - mergedApiIdentifier: The identifier of the AppSync Merged API. This is generated by the AppSync service. In most cases, Merged APIs (especially in your account) only require the API ID value or ARN of the merged API. However, Merged APIs in other accounts (cross-account use cases) strictly require the full resource ARN of the merged API.
    ///   - sourceApiAssociationConfig: The SourceApiAssociationConfig object data.
    ///   - sourceApiIdentifier: The identifier of the AppSync Source API. This is generated by the AppSync service. In most cases, source APIs (especially in your account) only require the API ID value or ARN of the source API. However, source APIs from other accounts (cross-account use cases) strictly require the full resource ARN of the source API.
    ///   - logger: Logger use during operation
    @inlinable
    public func associateMergedGraphqlApi(
        description: String? = nil,
        mergedApiIdentifier: String,
        sourceApiAssociationConfig: SourceApiAssociationConfig? = nil,
        sourceApiIdentifier: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> AssociateMergedGraphqlApiResponse {
        let input = AssociateMergedGraphqlApiRequest(
            description: description, 
            mergedApiIdentifier: mergedApiIdentifier, 
            sourceApiAssociationConfig: sourceApiAssociationConfig, 
            sourceApiIdentifier: sourceApiIdentifier
        )
        return try await self.associateMergedGraphqlApi(input, logger: logger)
    }

    /// Creates an association between a Merged API and source API using the Merged API's identifier.
    @Sendable
    @inlinable
    public func associateSourceGraphqlApi(_ input: AssociateSourceGraphqlApiRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> AssociateSourceGraphqlApiResponse {
        try await self.client.execute(
            operation: "AssociateSourceGraphqlApi", 
            path: "/v1/mergedApis/{mergedApiIdentifier}/sourceApiAssociations", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Creates an association between a Merged API and source API using the Merged API's identifier.
    ///
    /// Parameters:
    ///   - description: The description field.
    ///   - mergedApiIdentifier: The identifier of the AppSync Merged API. This is generated by the AppSync service. In most cases, Merged APIs (especially in your account) only require the API ID value or ARN of the merged API. However, Merged APIs in other accounts (cross-account use cases) strictly require the full resource ARN of the merged API.
    ///   - sourceApiAssociationConfig: The SourceApiAssociationConfig object data.
    ///   - sourceApiIdentifier: The identifier of the AppSync Source API. This is generated by the AppSync service. In most cases, source APIs (especially in your account) only require the API ID value or ARN of the source API. However, source APIs from other accounts (cross-account use cases) strictly require the full resource ARN of the source API.
    ///   - logger: Logger use during operation
    @inlinable
    public func associateSourceGraphqlApi(
        description: String? = nil,
        mergedApiIdentifier: String,
        sourceApiAssociationConfig: SourceApiAssociationConfig? = nil,
        sourceApiIdentifier: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> AssociateSourceGraphqlApiResponse {
        let input = AssociateSourceGraphqlApiRequest(
            description: description, 
            mergedApiIdentifier: mergedApiIdentifier, 
            sourceApiAssociationConfig: sourceApiAssociationConfig, 
            sourceApiIdentifier: sourceApiIdentifier
        )
        return try await self.associateSourceGraphqlApi(input, logger: logger)
    }

    /// Creates an Api object. Use this operation to create an AppSync API with your preferred configuration, such as an Event API that provides real-time message publishing and message subscriptions over WebSockets.
    @Sendable
    @inlinable
    public func createApi(_ input: CreateApiRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> CreateApiResponse {
        try await self.client.execute(
            operation: "CreateApi", 
            path: "/v2/apis", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Creates an Api object. Use this operation to create an AppSync API with your preferred configuration, such as an Event API that provides real-time message publishing and message subscriptions over WebSockets.
    ///
    /// Parameters:
    ///   - eventConfig: The Event API configuration. This includes the default authorization configuration for connecting, publishing, and subscribing to an Event API.
    ///   - name: The name for the Api.
    ///   - ownerContact: The owner contact information for the Api.
    ///   - tags: 
    ///   - logger: Logger use during operation
    @inlinable
    public func createApi(
        eventConfig: EventConfig? = nil,
        name: String,
        ownerContact: String? = nil,
        tags: [String: String]? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> CreateApiResponse {
        let input = CreateApiRequest(
            eventConfig: eventConfig, 
            name: name, 
            ownerContact: ownerContact, 
            tags: tags
        )
        return try await self.createApi(input, logger: logger)
    }

    /// Creates a cache for the GraphQL API.
    @Sendable
    @inlinable
    public func createApiCache(_ input: CreateApiCacheRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> CreateApiCacheResponse {
        try await self.client.execute(
            operation: "CreateApiCache", 
            path: "/v1/apis/{apiId}/ApiCaches", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Creates a cache for the GraphQL API.
    ///
    /// Parameters:
    ///   - apiCachingBehavior: Caching behavior.    FULL_REQUEST_CACHING: All requests from the same user are cached. Individual resolvers are automatically cached. All API calls will try to return responses from the cache.    PER_RESOLVER_CACHING: Individual resolvers that you specify are cached.    OPERATION_LEVEL_CACHING: Full requests are cached together and returned without executing resolvers.
    ///   - apiId: The GraphQL API ID.
    ///   - healthMetricsConfig: Controls how cache health metrics will be emitted to CloudWatch. Cache health metrics include:   NetworkBandwidthOutAllowanceExceeded: The network packets dropped because the throughput exceeded the aggregated bandwidth limit. This is useful for diagnosing bottlenecks in a cache configuration.   EngineCPUUtilization: The CPU utilization (percentage) allocated to the Redis process. This is useful for diagnosing bottlenecks in a cache configuration.   Metrics will be recorded by API ID. You can set the value to ENABLED or DISABLED.
    ///   - ttl: TTL in seconds for cache entries. Valid values are 1–3,600 seconds.
    ///   - type: The cache instance type. Valid values are     SMALL     MEDIUM     LARGE     XLARGE     LARGE_2X     LARGE_4X     LARGE_8X (not available in all regions)    LARGE_12X    Historically, instance types were identified by an EC2-style value. As of July 2020, this is deprecated, and the generic identifiers above should be used. The following legacy instance types are available, but their use is discouraged:    T2_SMALL: A t2.small instance type.    T2_MEDIUM: A t2.medium instance type.    R4_LARGE: A r4.large instance type.    R4_XLARGE: A r4.xlarge instance type.    R4_2XLARGE: A r4.2xlarge instance type.    R4_4XLARGE: A r4.4xlarge instance type.    R4_8XLARGE: A r4.8xlarge instance type.
    ///   - logger: Logger use during operation
    @inlinable
    public func createApiCache(
        apiCachingBehavior: ApiCachingBehavior,
        apiId: String,
        healthMetricsConfig: CacheHealthMetricsConfig? = nil,
        ttl: Int64 = 0,
        type: ApiCacheType,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> CreateApiCacheResponse {
        let input = CreateApiCacheRequest(
            apiCachingBehavior: apiCachingBehavior, 
            apiId: apiId, 
            healthMetricsConfig: healthMetricsConfig, 
            ttl: ttl, 
            type: type
        )
        return try await self.createApiCache(input, logger: logger)
    }

    /// Creates a unique key that you can distribute to clients who invoke your API.
    @Sendable
    @inlinable
    public func createApiKey(_ input: CreateApiKeyRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> CreateApiKeyResponse {
        try await self.client.execute(
            operation: "CreateApiKey", 
            path: "/v1/apis/{apiId}/apikeys", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Creates a unique key that you can distribute to clients who invoke your API.
    ///
    /// Parameters:
    ///   - apiId: The ID for your GraphQL API.
    ///   - description: A description of the purpose of the API key.
    ///   - expires: From the creation time, the time after which the API key expires. The date is represented as seconds since the epoch, rounded down to the nearest hour. The default value for this parameter is 7 days from creation time. For more information, see .
    ///   - logger: Logger use during operation
    @inlinable
    public func createApiKey(
        apiId: String,
        description: String? = nil,
        expires: Int64? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> CreateApiKeyResponse {
        let input = CreateApiKeyRequest(
            apiId: apiId, 
            description: description, 
            expires: expires
        )
        return try await self.createApiKey(input, logger: logger)
    }

    /// Creates a ChannelNamespace for an Api.
    @Sendable
    @inlinable
    public func createChannelNamespace(_ input: CreateChannelNamespaceRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> CreateChannelNamespaceResponse {
        try await self.client.execute(
            operation: "CreateChannelNamespace", 
            path: "/v2/apis/{apiId}/channelNamespaces", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Creates a ChannelNamespace for an Api.
    ///
    /// Parameters:
    ///   - apiId: The Api ID.
    ///   - codeHandlers: The event handler functions that run custom business logic to process published events and subscribe requests.
    ///   - handlerConfigs: The configuration for the OnPublish and OnSubscribe handlers.
    ///   - name: The name of the ChannelNamespace. This name must be unique within the Api
    ///   - publishAuthModes: The authorization mode to use for publishing messages on the channel namespace. This configuration overrides the default Api authorization configuration.
    ///   - subscribeAuthModes: The authorization mode to use for subscribing to messages on the channel namespace. This configuration overrides the default Api authorization configuration.
    ///   - tags: 
    ///   - logger: Logger use during operation
    @inlinable
    public func createChannelNamespace(
        apiId: String,
        codeHandlers: String? = nil,
        handlerConfigs: HandlerConfigs? = nil,
        name: String,
        publishAuthModes: [AuthMode]? = nil,
        subscribeAuthModes: [AuthMode]? = nil,
        tags: [String: String]? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> CreateChannelNamespaceResponse {
        let input = CreateChannelNamespaceRequest(
            apiId: apiId, 
            codeHandlers: codeHandlers, 
            handlerConfigs: handlerConfigs, 
            name: name, 
            publishAuthModes: publishAuthModes, 
            subscribeAuthModes: subscribeAuthModes, 
            tags: tags
        )
        return try await self.createChannelNamespace(input, logger: logger)
    }

    /// Creates a DataSource object.
    @Sendable
    @inlinable
    public func createDataSource(_ input: CreateDataSourceRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> CreateDataSourceResponse {
        try await self.client.execute(
            operation: "CreateDataSource", 
            path: "/v1/apis/{apiId}/datasources", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Creates a DataSource object.
    ///
    /// Parameters:
    ///   - apiId: The API ID for the GraphQL API for the DataSource.
    ///   - description: A description of the DataSource.
    ///   - dynamodbConfig: Amazon DynamoDB settings.
    ///   - elasticsearchConfig: Amazon OpenSearch Service settings. As of September 2021, Amazon Elasticsearch service is Amazon OpenSearch Service. This configuration is deprecated. For new data sources, use CreateDataSourceRequest$openSearchServiceConfig to create an OpenSearch data source.
    ///   - eventBridgeConfig: Amazon EventBridge settings.
    ///   - httpConfig: HTTP endpoint settings.
    ///   - lambdaConfig: Lambda settings.
    ///   - metricsConfig: Enables or disables enhanced data source metrics for specified data sources. Note that metricsConfig won't be used unless the dataSourceLevelMetricsBehavior value is set to PER_DATA_SOURCE_METRICS. If the dataSourceLevelMetricsBehavior is set to FULL_REQUEST_DATA_SOURCE_METRICS instead, metricsConfig will be ignored. However, you can still set its value.  metricsConfig can be ENABLED or DISABLED.
    ///   - name: A user-supplied name for the DataSource.
    ///   - openSearchServiceConfig: Amazon OpenSearch Service settings.
    ///   - relationalDatabaseConfig: Relational database settings.
    ///   - serviceRoleArn: The Identity and Access Management (IAM) service role Amazon Resource Name (ARN) for the data source. The system assumes this role when accessing the data source.
    ///   - type: The type of the DataSource.
    ///   - logger: Logger use during operation
    @inlinable
    public func createDataSource(
        apiId: String,
        description: String? = nil,
        dynamodbConfig: DynamodbDataSourceConfig? = nil,
        elasticsearchConfig: ElasticsearchDataSourceConfig? = nil,
        eventBridgeConfig: EventBridgeDataSourceConfig? = nil,
        httpConfig: HttpDataSourceConfig? = nil,
        lambdaConfig: LambdaDataSourceConfig? = nil,
        metricsConfig: DataSourceLevelMetricsConfig? = nil,
        name: String,
        openSearchServiceConfig: OpenSearchServiceDataSourceConfig? = nil,
        relationalDatabaseConfig: RelationalDatabaseDataSourceConfig? = nil,
        serviceRoleArn: String? = nil,
        type: DataSourceType,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> CreateDataSourceResponse {
        let input = CreateDataSourceRequest(
            apiId: apiId, 
            description: description, 
            dynamodbConfig: dynamodbConfig, 
            elasticsearchConfig: elasticsearchConfig, 
            eventBridgeConfig: eventBridgeConfig, 
            httpConfig: httpConfig, 
            lambdaConfig: lambdaConfig, 
            metricsConfig: metricsConfig, 
            name: name, 
            openSearchServiceConfig: openSearchServiceConfig, 
            relationalDatabaseConfig: relationalDatabaseConfig, 
            serviceRoleArn: serviceRoleArn, 
            type: type
        )
        return try await self.createDataSource(input, logger: logger)
    }

    /// Creates a custom DomainName object.
    @Sendable
    @inlinable
    public func createDomainName(_ input: CreateDomainNameRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> CreateDomainNameResponse {
        try await self.client.execute(
            operation: "CreateDomainName", 
            path: "/v1/domainnames", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Creates a custom DomainName object.
    ///
    /// Parameters:
    ///   - certificateArn: The Amazon Resource Name (ARN) of the certificate. This can be an Certificate Manager (ACM) certificate or an Identity and Access Management (IAM) server certificate.
    ///   - description: A description of the DomainName.
    ///   - domainName: The domain name.
    ///   - tags: 
    ///   - logger: Logger use during operation
    @inlinable
    public func createDomainName(
        certificateArn: String,
        description: String? = nil,
        domainName: String,
        tags: [String: String]? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> CreateDomainNameResponse {
        let input = CreateDomainNameRequest(
            certificateArn: certificateArn, 
            description: description, 
            domainName: domainName, 
            tags: tags
        )
        return try await self.createDomainName(input, logger: logger)
    }

    /// Creates a Function object. A function is a reusable entity. You can use multiple functions to compose the resolver logic.
    @Sendable
    @inlinable
    public func createFunction(_ input: CreateFunctionRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> CreateFunctionResponse {
        try await self.client.execute(
            operation: "CreateFunction", 
            path: "/v1/apis/{apiId}/functions", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Creates a Function object. A function is a reusable entity. You can use multiple functions to compose the resolver logic.
    ///
    /// Parameters:
    ///   - apiId: The GraphQL API ID.
    ///   - code: The function code that contains the request and response functions. When code is used, the runtime is required. The runtime value must be APPSYNC_JS.
    ///   - dataSourceName: The Function DataSource name.
    ///   - description: The Function description.
    ///   - functionVersion: The version of the request mapping template. Currently, the supported value is 2018-05-29. Note that when using VTL and mapping templates, the functionVersion is required.
    ///   - maxBatchSize: The maximum batching size for a resolver.
    ///   - name: The Function name. The function name does not have to be unique.
    ///   - requestMappingTemplate: The Function request mapping template. Functions support only the 2018-05-29 version of the request mapping template.
    ///   - responseMappingTemplate: The Function response mapping template.
    ///   - runtime: 
    ///   - syncConfig: 
    ///   - logger: Logger use during operation
    @inlinable
    public func createFunction(
        apiId: String,
        code: String? = nil,
        dataSourceName: String,
        description: String? = nil,
        functionVersion: String? = nil,
        maxBatchSize: Int? = nil,
        name: String,
        requestMappingTemplate: String? = nil,
        responseMappingTemplate: String? = nil,
        runtime: AppSyncRuntime? = nil,
        syncConfig: SyncConfig? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> CreateFunctionResponse {
        let input = CreateFunctionRequest(
            apiId: apiId, 
            code: code, 
            dataSourceName: dataSourceName, 
            description: description, 
            functionVersion: functionVersion, 
            maxBatchSize: maxBatchSize, 
            name: name, 
            requestMappingTemplate: requestMappingTemplate, 
            responseMappingTemplate: responseMappingTemplate, 
            runtime: runtime, 
            syncConfig: syncConfig
        )
        return try await self.createFunction(input, logger: logger)
    }

    /// Creates a GraphqlApi object.
    @Sendable
    @inlinable
    public func createGraphqlApi(_ input: CreateGraphqlApiRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> CreateGraphqlApiResponse {
        try await self.client.execute(
            operation: "CreateGraphqlApi", 
            path: "/v1/apis", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Creates a GraphqlApi object.
    ///
    /// Parameters:
    ///   - additionalAuthenticationProviders: A list of additional authentication providers for the GraphqlApi API.
    ///   - apiType: The value that indicates whether the GraphQL API is a standard API (GRAPHQL) or merged API (MERGED).
    ///   - authenticationType: The authentication type: API key, Identity and Access Management (IAM), OpenID Connect (OIDC), Amazon Cognito user pools, or Lambda.
    ///   - enhancedMetricsConfig: The enhancedMetricsConfig object.
    ///   - introspectionConfig: Sets the value of the GraphQL API to enable (ENABLED) or disable (DISABLED) introspection. If no value is provided, the introspection configuration will be set to ENABLED by default. This field will produce an error if the operation attempts to use the introspection feature while this field is disabled. For more information about introspection, see GraphQL introspection.
    ///   - lambdaAuthorizerConfig: Configuration for Lambda function authorization.
    ///   - logConfig: The Amazon CloudWatch Logs configuration.
    ///   - mergedApiExecutionRoleArn: The Identity and Access Management service role ARN for a merged API. The AppSync service assumes this role on behalf of the Merged API to validate access to source APIs at runtime and to prompt the AUTO_MERGE to update the merged API endpoint with the source API changes automatically.
    ///   - name: A user-supplied name for the GraphqlApi.
    ///   - openIDConnectConfig: The OIDC configuration.
    ///   - ownerContact: The owner contact information for an API resource. This field accepts any string input with a length of 0 - 256 characters.
    ///   - queryDepthLimit: The maximum depth a query can have in a single request. Depth refers to the amount of nested levels allowed in the body of query. The default value is 0 (or unspecified), which indicates there's no depth limit. If you set a limit, it can be between 1 and 75 nested levels. This field will produce a limit error if the operation falls out of bounds. Note that fields can still be set to nullable or non-nullable. If a non-nullable field produces an error, the error will be thrown upwards to the first nullable field available.
    ///   - resolverCountLimit: The maximum number of resolvers that can be invoked in a single request. The default value is 0 (or unspecified), which will set the limit to 10000. When specified, the limit value can be between 1 and 10000. This field will produce a limit error if the operation falls out of bounds.
    ///   - tags: A TagMap object.
    ///   - userPoolConfig: The Amazon Cognito user pool configuration.
    ///   - visibility: Sets the value of the GraphQL API to public (GLOBAL) or private (PRIVATE). If no value is provided, the visibility will be set to GLOBAL by default. This value cannot be changed once the API has been created.
    ///   - xrayEnabled: A flag indicating whether to use X-Ray tracing for the GraphqlApi.
    ///   - logger: Logger use during operation
    @inlinable
    public func createGraphqlApi(
        additionalAuthenticationProviders: [AdditionalAuthenticationProvider]? = nil,
        apiType: GraphQLApiType? = nil,
        authenticationType: AuthenticationType,
        enhancedMetricsConfig: EnhancedMetricsConfig? = nil,
        introspectionConfig: GraphQLApiIntrospectionConfig? = nil,
        lambdaAuthorizerConfig: LambdaAuthorizerConfig? = nil,
        logConfig: LogConfig? = nil,
        mergedApiExecutionRoleArn: String? = nil,
        name: String,
        openIDConnectConfig: OpenIDConnectConfig? = nil,
        ownerContact: String? = nil,
        queryDepthLimit: Int? = nil,
        resolverCountLimit: Int? = nil,
        tags: [String: String]? = nil,
        userPoolConfig: UserPoolConfig? = nil,
        visibility: GraphQLApiVisibility? = nil,
        xrayEnabled: Bool? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> CreateGraphqlApiResponse {
        let input = CreateGraphqlApiRequest(
            additionalAuthenticationProviders: additionalAuthenticationProviders, 
            apiType: apiType, 
            authenticationType: authenticationType, 
            enhancedMetricsConfig: enhancedMetricsConfig, 
            introspectionConfig: introspectionConfig, 
            lambdaAuthorizerConfig: lambdaAuthorizerConfig, 
            logConfig: logConfig, 
            mergedApiExecutionRoleArn: mergedApiExecutionRoleArn, 
            name: name, 
            openIDConnectConfig: openIDConnectConfig, 
            ownerContact: ownerContact, 
            queryDepthLimit: queryDepthLimit, 
            resolverCountLimit: resolverCountLimit, 
            tags: tags, 
            userPoolConfig: userPoolConfig, 
            visibility: visibility, 
            xrayEnabled: xrayEnabled
        )
        return try await self.createGraphqlApi(input, logger: logger)
    }

    /// Creates a Resolver object. A resolver converts incoming requests into a format that a data source can understand, and converts the data source's responses into GraphQL.
    @Sendable
    @inlinable
    public func createResolver(_ input: CreateResolverRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> CreateResolverResponse {
        try await self.client.execute(
            operation: "CreateResolver", 
            path: "/v1/apis/{apiId}/types/{typeName}/resolvers", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Creates a Resolver object. A resolver converts incoming requests into a format that a data source can understand, and converts the data source's responses into GraphQL.
    ///
    /// Parameters:
    ///   - apiId: The ID for the GraphQL API for which the resolver is being created.
    ///   - cachingConfig: The caching configuration for the resolver.
    ///   - code: The resolver code that contains the request and response functions. When code is used, the runtime is required. The runtime value must be APPSYNC_JS.
    ///   - dataSourceName: The name of the data source for which the resolver is being created.
    ///   - fieldName: The name of the field to attach the resolver to.
    ///   - kind: The resolver type.    UNIT: A UNIT resolver type. A UNIT resolver is the default resolver type. You can use a UNIT resolver to run a GraphQL query against a single data source.    PIPELINE: A PIPELINE resolver type. You can use a PIPELINE resolver to invoke a series of Function objects in a serial manner. You can use a pipeline resolver to run a GraphQL query against multiple data sources.
    ///   - maxBatchSize: The maximum batching size for a resolver.
    ///   - metricsConfig: Enables or disables enhanced resolver metrics for specified resolvers. Note that metricsConfig won't be used unless the resolverLevelMetricsBehavior value is set to PER_RESOLVER_METRICS. If the resolverLevelMetricsBehavior is set to FULL_REQUEST_RESOLVER_METRICS instead, metricsConfig will be ignored. However, you can still set its value.  metricsConfig can be ENABLED or DISABLED.
    ///   - pipelineConfig: The PipelineConfig.
    ///   - requestMappingTemplate: The mapping template to use for requests. A resolver uses a request mapping template to convert a GraphQL expression into a format that a data source can understand. Mapping templates are written in Apache Velocity Template Language (VTL). VTL request mapping templates are optional when using an Lambda data source. For all other data sources, VTL request and response mapping templates are required.
    ///   - responseMappingTemplate: The mapping template to use for responses from the data source.
    ///   - runtime: 
    ///   - syncConfig: The SyncConfig for a resolver attached to a versioned data source.
    ///   - typeName: The name of the Type.
    ///   - logger: Logger use during operation
    @inlinable
    public func createResolver(
        apiId: String,
        cachingConfig: CachingConfig? = nil,
        code: String? = nil,
        dataSourceName: String? = nil,
        fieldName: String,
        kind: ResolverKind? = nil,
        maxBatchSize: Int? = nil,
        metricsConfig: ResolverLevelMetricsConfig? = nil,
        pipelineConfig: PipelineConfig? = nil,
        requestMappingTemplate: String? = nil,
        responseMappingTemplate: String? = nil,
        runtime: AppSyncRuntime? = nil,
        syncConfig: SyncConfig? = nil,
        typeName: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> CreateResolverResponse {
        let input = CreateResolverRequest(
            apiId: apiId, 
            cachingConfig: cachingConfig, 
            code: code, 
            dataSourceName: dataSourceName, 
            fieldName: fieldName, 
            kind: kind, 
            maxBatchSize: maxBatchSize, 
            metricsConfig: metricsConfig, 
            pipelineConfig: pipelineConfig, 
            requestMappingTemplate: requestMappingTemplate, 
            responseMappingTemplate: responseMappingTemplate, 
            runtime: runtime, 
            syncConfig: syncConfig, 
            typeName: typeName
        )
        return try await self.createResolver(input, logger: logger)
    }

    /// Creates a Type object.
    @Sendable
    @inlinable
    public func createType(_ input: CreateTypeRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> CreateTypeResponse {
        try await self.client.execute(
            operation: "CreateType", 
            path: "/v1/apis/{apiId}/types", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Creates a Type object.
    ///
    /// Parameters:
    ///   - apiId: The API ID.
    ///   - definition: The type definition, in GraphQL Schema Definition Language (SDL) format. For more information, see the GraphQL SDL documentation.
    ///   - format: The type format: SDL or JSON.
    ///   - logger: Logger use during operation
    @inlinable
    public func createType(
        apiId: String,
        definition: String,
        format: TypeDefinitionFormat,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> CreateTypeResponse {
        let input = CreateTypeRequest(
            apiId: apiId, 
            definition: definition, 
            format: format
        )
        return try await self.createType(input, logger: logger)
    }

    /// Deletes an Api object
    @Sendable
    @inlinable
    public func deleteApi(_ input: DeleteApiRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DeleteApiResponse {
        try await self.client.execute(
            operation: "DeleteApi", 
            path: "/v2/apis/{apiId}", 
            httpMethod: .DELETE, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Deletes an Api object
    ///
    /// Parameters:
    ///   - apiId: The Api ID.
    ///   - logger: Logger use during operation
    @inlinable
    public func deleteApi(
        apiId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DeleteApiResponse {
        let input = DeleteApiRequest(
            apiId: apiId
        )
        return try await self.deleteApi(input, logger: logger)
    }

    /// Deletes an ApiCache object.
    @Sendable
    @inlinable
    public func deleteApiCache(_ input: DeleteApiCacheRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DeleteApiCacheResponse {
        try await self.client.execute(
            operation: "DeleteApiCache", 
            path: "/v1/apis/{apiId}/ApiCaches", 
            httpMethod: .DELETE, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Deletes an ApiCache object.
    ///
    /// Parameters:
    ///   - apiId: The API ID.
    ///   - logger: Logger use during operation
    @inlinable
    public func deleteApiCache(
        apiId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DeleteApiCacheResponse {
        let input = DeleteApiCacheRequest(
            apiId: apiId
        )
        return try await self.deleteApiCache(input, logger: logger)
    }

    /// Deletes an API key.
    @Sendable
    @inlinable
    public func deleteApiKey(_ input: DeleteApiKeyRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DeleteApiKeyResponse {
        try await self.client.execute(
            operation: "DeleteApiKey", 
            path: "/v1/apis/{apiId}/apikeys/{id}", 
            httpMethod: .DELETE, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Deletes an API key.
    ///
    /// Parameters:
    ///   - apiId: The API ID.
    ///   - id: The ID for the API key.
    ///   - logger: Logger use during operation
    @inlinable
    public func deleteApiKey(
        apiId: String,
        id: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DeleteApiKeyResponse {
        let input = DeleteApiKeyRequest(
            apiId: apiId, 
            id: id
        )
        return try await self.deleteApiKey(input, logger: logger)
    }

    /// Deletes a ChannelNamespace.
    @Sendable
    @inlinable
    public func deleteChannelNamespace(_ input: DeleteChannelNamespaceRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DeleteChannelNamespaceResponse {
        try await self.client.execute(
            operation: "DeleteChannelNamespace", 
            path: "/v2/apis/{apiId}/channelNamespaces/{name}", 
            httpMethod: .DELETE, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Deletes a ChannelNamespace.
    ///
    /// Parameters:
    ///   - apiId: The ID of the Api associated with the ChannelNamespace.
    ///   - name: The name of the ChannelNamespace.
    ///   - logger: Logger use during operation
    @inlinable
    public func deleteChannelNamespace(
        apiId: String,
        name: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DeleteChannelNamespaceResponse {
        let input = DeleteChannelNamespaceRequest(
            apiId: apiId, 
            name: name
        )
        return try await self.deleteChannelNamespace(input, logger: logger)
    }

    /// Deletes a DataSource object.
    @Sendable
    @inlinable
    public func deleteDataSource(_ input: DeleteDataSourceRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DeleteDataSourceResponse {
        try await self.client.execute(
            operation: "DeleteDataSource", 
            path: "/v1/apis/{apiId}/datasources/{name}", 
            httpMethod: .DELETE, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Deletes a DataSource object.
    ///
    /// Parameters:
    ///   - apiId: The API ID.
    ///   - name: The name of the data source.
    ///   - logger: Logger use during operation
    @inlinable
    public func deleteDataSource(
        apiId: String,
        name: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DeleteDataSourceResponse {
        let input = DeleteDataSourceRequest(
            apiId: apiId, 
            name: name
        )
        return try await self.deleteDataSource(input, logger: logger)
    }

    /// Deletes a custom DomainName object.
    @Sendable
    @inlinable
    public func deleteDomainName(_ input: DeleteDomainNameRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DeleteDomainNameResponse {
        try await self.client.execute(
            operation: "DeleteDomainName", 
            path: "/v1/domainnames/{domainName}", 
            httpMethod: .DELETE, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Deletes a custom DomainName object.
    ///
    /// Parameters:
    ///   - domainName: The domain name.
    ///   - logger: Logger use during operation
    @inlinable
    public func deleteDomainName(
        domainName: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DeleteDomainNameResponse {
        let input = DeleteDomainNameRequest(
            domainName: domainName
        )
        return try await self.deleteDomainName(input, logger: logger)
    }

    /// Deletes a Function.
    @Sendable
    @inlinable
    public func deleteFunction(_ input: DeleteFunctionRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DeleteFunctionResponse {
        try await self.client.execute(
            operation: "DeleteFunction", 
            path: "/v1/apis/{apiId}/functions/{functionId}", 
            httpMethod: .DELETE, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Deletes a Function.
    ///
    /// Parameters:
    ///   - apiId: The GraphQL API ID.
    ///   - functionId: The Function ID.
    ///   - logger: Logger use during operation
    @inlinable
    public func deleteFunction(
        apiId: String,
        functionId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DeleteFunctionResponse {
        let input = DeleteFunctionRequest(
            apiId: apiId, 
            functionId: functionId
        )
        return try await self.deleteFunction(input, logger: logger)
    }

    /// Deletes a GraphqlApi object.
    @Sendable
    @inlinable
    public func deleteGraphqlApi(_ input: DeleteGraphqlApiRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DeleteGraphqlApiResponse {
        try await self.client.execute(
            operation: "DeleteGraphqlApi", 
            path: "/v1/apis/{apiId}", 
            httpMethod: .DELETE, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Deletes a GraphqlApi object.
    ///
    /// Parameters:
    ///   - apiId: The API ID.
    ///   - logger: Logger use during operation
    @inlinable
    public func deleteGraphqlApi(
        apiId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DeleteGraphqlApiResponse {
        let input = DeleteGraphqlApiRequest(
            apiId: apiId
        )
        return try await self.deleteGraphqlApi(input, logger: logger)
    }

    /// Deletes a Resolver object.
    @Sendable
    @inlinable
    public func deleteResolver(_ input: DeleteResolverRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DeleteResolverResponse {
        try await self.client.execute(
            operation: "DeleteResolver", 
            path: "/v1/apis/{apiId}/types/{typeName}/resolvers/{fieldName}", 
            httpMethod: .DELETE, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Deletes a Resolver object.
    ///
    /// Parameters:
    ///   - apiId: The API ID.
    ///   - fieldName: The resolver field name.
    ///   - typeName: The name of the resolver type.
    ///   - logger: Logger use during operation
    @inlinable
    public func deleteResolver(
        apiId: String,
        fieldName: String,
        typeName: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DeleteResolverResponse {
        let input = DeleteResolverRequest(
            apiId: apiId, 
            fieldName: fieldName, 
            typeName: typeName
        )
        return try await self.deleteResolver(input, logger: logger)
    }

    /// Deletes a Type object.
    @Sendable
    @inlinable
    public func deleteType(_ input: DeleteTypeRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DeleteTypeResponse {
        try await self.client.execute(
            operation: "DeleteType", 
            path: "/v1/apis/{apiId}/types/{typeName}", 
            httpMethod: .DELETE, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Deletes a Type object.
    ///
    /// Parameters:
    ///   - apiId: The API ID.
    ///   - typeName: The type name.
    ///   - logger: Logger use during operation
    @inlinable
    public func deleteType(
        apiId: String,
        typeName: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DeleteTypeResponse {
        let input = DeleteTypeRequest(
            apiId: apiId, 
            typeName: typeName
        )
        return try await self.deleteType(input, logger: logger)
    }

    /// Removes an ApiAssociation object from a custom domain.
    @Sendable
    @inlinable
    public func disassociateApi(_ input: DisassociateApiRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DisassociateApiResponse {
        try await self.client.execute(
            operation: "DisassociateApi", 
            path: "/v1/domainnames/{domainName}/apiassociation", 
            httpMethod: .DELETE, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Removes an ApiAssociation object from a custom domain.
    ///
    /// Parameters:
    ///   - domainName: The domain name.
    ///   - logger: Logger use during operation
    @inlinable
    public func disassociateApi(
        domainName: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DisassociateApiResponse {
        let input = DisassociateApiRequest(
            domainName: domainName
        )
        return try await self.disassociateApi(input, logger: logger)
    }

    /// Deletes an association between a Merged API and source API using the source API's identifier and the association ID.
    @Sendable
    @inlinable
    public func disassociateMergedGraphqlApi(_ input: DisassociateMergedGraphqlApiRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DisassociateMergedGraphqlApiResponse {
        try await self.client.execute(
            operation: "DisassociateMergedGraphqlApi", 
            path: "/v1/sourceApis/{sourceApiIdentifier}/mergedApiAssociations/{associationId}", 
            httpMethod: .DELETE, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Deletes an association between a Merged API and source API using the source API's identifier and the association ID.
    ///
    /// Parameters:
    ///   - associationId: The ID generated by the AppSync service for the source API association.
    ///   - sourceApiIdentifier: The identifier of the AppSync Source API. This is generated by the AppSync service. In most cases, source APIs (especially in your account) only require the API ID value or ARN of the source API. However, source APIs from other accounts (cross-account use cases) strictly require the full resource ARN of the source API.
    ///   - logger: Logger use during operation
    @inlinable
    public func disassociateMergedGraphqlApi(
        associationId: String,
        sourceApiIdentifier: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DisassociateMergedGraphqlApiResponse {
        let input = DisassociateMergedGraphqlApiRequest(
            associationId: associationId, 
            sourceApiIdentifier: sourceApiIdentifier
        )
        return try await self.disassociateMergedGraphqlApi(input, logger: logger)
    }

    /// Deletes an association between a Merged API and source API using the Merged API's identifier and the association ID.
    @Sendable
    @inlinable
    public func disassociateSourceGraphqlApi(_ input: DisassociateSourceGraphqlApiRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DisassociateSourceGraphqlApiResponse {
        try await self.client.execute(
            operation: "DisassociateSourceGraphqlApi", 
            path: "/v1/mergedApis/{mergedApiIdentifier}/sourceApiAssociations/{associationId}", 
            httpMethod: .DELETE, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Deletes an association between a Merged API and source API using the Merged API's identifier and the association ID.
    ///
    /// Parameters:
    ///   - associationId: The ID generated by the AppSync service for the source API association.
    ///   - mergedApiIdentifier: The identifier of the AppSync Merged API. This is generated by the AppSync service. In most cases, Merged APIs (especially in your account) only require the API ID value or ARN of the merged API. However, Merged APIs in other accounts (cross-account use cases) strictly require the full resource ARN of the merged API.
    ///   - logger: Logger use during operation
    @inlinable
    public func disassociateSourceGraphqlApi(
        associationId: String,
        mergedApiIdentifier: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DisassociateSourceGraphqlApiResponse {
        let input = DisassociateSourceGraphqlApiRequest(
            associationId: associationId, 
            mergedApiIdentifier: mergedApiIdentifier
        )
        return try await self.disassociateSourceGraphqlApi(input, logger: logger)
    }

    /// Evaluates the given code and returns the response. The code definition requirements depend on the specified runtime. For APPSYNC_JS runtimes, the code defines the request and response functions. The request function takes the incoming request after a GraphQL operation is parsed and converts it into a request configuration for the selected data source operation. The response function interprets responses from the data source and maps it to the shape of the GraphQL field output type.
    @Sendable
    @inlinable
    public func evaluateCode(_ input: EvaluateCodeRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> EvaluateCodeResponse {
        try await self.client.execute(
            operation: "EvaluateCode", 
            path: "/v1/dataplane-evaluatecode", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Evaluates the given code and returns the response. The code definition requirements depend on the specified runtime. For APPSYNC_JS runtimes, the code defines the request and response functions. The request function takes the incoming request after a GraphQL operation is parsed and converts it into a request configuration for the selected data source operation. The response function interprets responses from the data source and maps it to the shape of the GraphQL field output type.
    ///
    /// Parameters:
    ///   - code: The code definition to be evaluated. Note that code and runtime are both required for this action. The runtime value must be APPSYNC_JS.
    ///   - context: The map that holds all of the contextual information for your resolver invocation. A context is required for this action.
    ///   - function: The function within the code to be evaluated. If provided, the valid values are request and response.
    ///   - runtime: The runtime to be used when evaluating the code. Currently, only the APPSYNC_JS runtime is supported.
    ///   - logger: Logger use during operation
    @inlinable
    public func evaluateCode(
        code: String,
        context: String,
        function: String? = nil,
        runtime: AppSyncRuntime,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> EvaluateCodeResponse {
        let input = EvaluateCodeRequest(
            code: code, 
            context: context, 
            function: function, 
            runtime: runtime
        )
        return try await self.evaluateCode(input, logger: logger)
    }

    /// Evaluates a given template and returns the response. The mapping template can be a request or response template. Request templates take the incoming request after a GraphQL operation is parsed and convert it into a request configuration for the selected data source operation. Response templates interpret responses from the data source and map it to the shape of the GraphQL field output type. Mapping templates are written in the Apache Velocity Template Language (VTL).
    @Sendable
    @inlinable
    public func evaluateMappingTemplate(_ input: EvaluateMappingTemplateRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> EvaluateMappingTemplateResponse {
        try await self.client.execute(
            operation: "EvaluateMappingTemplate", 
            path: "/v1/dataplane-evaluatetemplate", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Evaluates a given template and returns the response. The mapping template can be a request or response template. Request templates take the incoming request after a GraphQL operation is parsed and convert it into a request configuration for the selected data source operation. Response templates interpret responses from the data source and map it to the shape of the GraphQL field output type. Mapping templates are written in the Apache Velocity Template Language (VTL).
    ///
    /// Parameters:
    ///   - context: The map that holds all of the contextual information for your resolver invocation. A context is required for this action.
    ///   - template: The mapping template; this can be a request or response template. A template is required for this action.
    ///   - logger: Logger use during operation
    @inlinable
    public func evaluateMappingTemplate(
        context: String,
        template: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> EvaluateMappingTemplateResponse {
        let input = EvaluateMappingTemplateRequest(
            context: context, 
            template: template
        )
        return try await self.evaluateMappingTemplate(input, logger: logger)
    }

    /// Flushes an ApiCache object.
    @Sendable
    @inlinable
    public func flushApiCache(_ input: FlushApiCacheRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> FlushApiCacheResponse {
        try await self.client.execute(
            operation: "FlushApiCache", 
            path: "/v1/apis/{apiId}/FlushCache", 
            httpMethod: .DELETE, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Flushes an ApiCache object.
    ///
    /// Parameters:
    ///   - apiId: The API ID.
    ///   - logger: Logger use during operation
    @inlinable
    public func flushApiCache(
        apiId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> FlushApiCacheResponse {
        let input = FlushApiCacheRequest(
            apiId: apiId
        )
        return try await self.flushApiCache(input, logger: logger)
    }

    /// Retrieves an Api object.
    @Sendable
    @inlinable
    public func getApi(_ input: GetApiRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> GetApiResponse {
        try await self.client.execute(
            operation: "GetApi", 
            path: "/v2/apis/{apiId}", 
            httpMethod: .GET, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Retrieves an Api object.
    ///
    /// Parameters:
    ///   - apiId: The Api ID.
    ///   - logger: Logger use during operation
    @inlinable
    public func getApi(
        apiId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> GetApiResponse {
        let input = GetApiRequest(
            apiId: apiId
        )
        return try await self.getApi(input, logger: logger)
    }

    /// Retrieves an ApiAssociation object.
    @Sendable
    @inlinable
    public func getApiAssociation(_ input: GetApiAssociationRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> GetApiAssociationResponse {
        try await self.client.execute(
            operation: "GetApiAssociation", 
            path: "/v1/domainnames/{domainName}/apiassociation", 
            httpMethod: .GET, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Retrieves an ApiAssociation object.
    ///
    /// Parameters:
    ///   - domainName: The domain name.
    ///   - logger: Logger use during operation
    @inlinable
    public func getApiAssociation(
        domainName: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> GetApiAssociationResponse {
        let input = GetApiAssociationRequest(
            domainName: domainName
        )
        return try await self.getApiAssociation(input, logger: logger)
    }

    /// Retrieves an ApiCache object.
    @Sendable
    @inlinable
    public func getApiCache(_ input: GetApiCacheRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> GetApiCacheResponse {
        try await self.client.execute(
            operation: "GetApiCache", 
            path: "/v1/apis/{apiId}/ApiCaches", 
            httpMethod: .GET, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Retrieves an ApiCache object.
    ///
    /// Parameters:
    ///   - apiId: The API ID.
    ///   - logger: Logger use during operation
    @inlinable
    public func getApiCache(
        apiId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> GetApiCacheResponse {
        let input = GetApiCacheRequest(
            apiId: apiId
        )
        return try await self.getApiCache(input, logger: logger)
    }

    /// Retrieves the channel namespace for a specified Api.
    @Sendable
    @inlinable
    public func getChannelNamespace(_ input: GetChannelNamespaceRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> GetChannelNamespaceResponse {
        try await self.client.execute(
            operation: "GetChannelNamespace", 
            path: "/v2/apis/{apiId}/channelNamespaces/{name}", 
            httpMethod: .GET, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Retrieves the channel namespace for a specified Api.
    ///
    /// Parameters:
    ///   - apiId: The Api ID.
    ///   - name: The name of the ChannelNamespace.
    ///   - logger: Logger use during operation
    @inlinable
    public func getChannelNamespace(
        apiId: String,
        name: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> GetChannelNamespaceResponse {
        let input = GetChannelNamespaceRequest(
            apiId: apiId, 
            name: name
        )
        return try await self.getChannelNamespace(input, logger: logger)
    }

    /// Retrieves a DataSource object.
    @Sendable
    @inlinable
    public func getDataSource(_ input: GetDataSourceRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> GetDataSourceResponse {
        try await self.client.execute(
            operation: "GetDataSource", 
            path: "/v1/apis/{apiId}/datasources/{name}", 
            httpMethod: .GET, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Retrieves a DataSource object.
    ///
    /// Parameters:
    ///   - apiId: The API ID.
    ///   - name: The name of the data source.
    ///   - logger: Logger use during operation
    @inlinable
    public func getDataSource(
        apiId: String,
        name: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> GetDataSourceResponse {
        let input = GetDataSourceRequest(
            apiId: apiId, 
            name: name
        )
        return try await self.getDataSource(input, logger: logger)
    }

    /// Retrieves the record of an existing introspection. If the retrieval is successful, the result of the instrospection will also be returned. If the retrieval fails the operation, an error message will be returned instead.
    @Sendable
    @inlinable
    public func getDataSourceIntrospection(_ input: GetDataSourceIntrospectionRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> GetDataSourceIntrospectionResponse {
        try await self.client.execute(
            operation: "GetDataSourceIntrospection", 
            path: "/v1/datasources/introspections/{introspectionId}", 
            httpMethod: .GET, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Retrieves the record of an existing introspection. If the retrieval is successful, the result of the instrospection will also be returned. If the retrieval fails the operation, an error message will be returned instead.
    ///
    /// Parameters:
    ///   - includeModelsSDL: A boolean flag that determines whether SDL should be generated for introspected types. If set to true, each model will contain an sdl property that contains the SDL for that type. The SDL only contains the type data and no additional metadata or directives.
    ///   - introspectionId: The introspection ID. Each introspection contains a unique ID that can be used to reference the instrospection record.
    ///   - maxResults: The maximum number of introspected types that will be returned in a single response.
    ///   - nextToken: Determines the number of types to be returned in a single response before paginating. This value is typically taken from nextToken value from the previous response.
    ///   - logger: Logger use during operation
    @inlinable
    public func getDataSourceIntrospection(
        includeModelsSDL: Bool? = nil,
        introspectionId: String,
        maxResults: Int? = nil,
        nextToken: String? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> GetDataSourceIntrospectionResponse {
        let input = GetDataSourceIntrospectionRequest(
            includeModelsSDL: includeModelsSDL, 
            introspectionId: introspectionId, 
            maxResults: maxResults, 
            nextToken: nextToken
        )
        return try await self.getDataSourceIntrospection(input, logger: logger)
    }

    /// Retrieves a custom DomainName object.
    @Sendable
    @inlinable
    public func getDomainName(_ input: GetDomainNameRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> GetDomainNameResponse {
        try await self.client.execute(
            operation: "GetDomainName", 
            path: "/v1/domainnames/{domainName}", 
            httpMethod: .GET, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Retrieves a custom DomainName object.
    ///
    /// Parameters:
    ///   - domainName: The domain name.
    ///   - logger: Logger use during operation
    @inlinable
    public func getDomainName(
        domainName: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> GetDomainNameResponse {
        let input = GetDomainNameRequest(
            domainName: domainName
        )
        return try await self.getDomainName(input, logger: logger)
    }

    /// Get a Function.
    @Sendable
    @inlinable
    public func getFunction(_ input: GetFunctionRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> GetFunctionResponse {
        try await self.client.execute(
            operation: "GetFunction", 
            path: "/v1/apis/{apiId}/functions/{functionId}", 
            httpMethod: .GET, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Get a Function.
    ///
    /// Parameters:
    ///   - apiId: The GraphQL API ID.
    ///   - functionId: The Function ID.
    ///   - logger: Logger use during operation
    @inlinable
    public func getFunction(
        apiId: String,
        functionId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> GetFunctionResponse {
        let input = GetFunctionRequest(
            apiId: apiId, 
            functionId: functionId
        )
        return try await self.getFunction(input, logger: logger)
    }

    /// Retrieves a GraphqlApi object.
    @Sendable
    @inlinable
    public func getGraphqlApi(_ input: GetGraphqlApiRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> GetGraphqlApiResponse {
        try await self.client.execute(
            operation: "GetGraphqlApi", 
            path: "/v1/apis/{apiId}", 
            httpMethod: .GET, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Retrieves a GraphqlApi object.
    ///
    /// Parameters:
    ///   - apiId: The API ID for the GraphQL API.
    ///   - logger: Logger use during operation
    @inlinable
    public func getGraphqlApi(
        apiId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> GetGraphqlApiResponse {
        let input = GetGraphqlApiRequest(
            apiId: apiId
        )
        return try await self.getGraphqlApi(input, logger: logger)
    }

    /// Retrieves the list of environmental variable key-value pairs associated with an API by its ID value.
    @Sendable
    @inlinable
    public func getGraphqlApiEnvironmentVariables(_ input: GetGraphqlApiEnvironmentVariablesRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> GetGraphqlApiEnvironmentVariablesResponse {
        try await self.client.execute(
            operation: "GetGraphqlApiEnvironmentVariables", 
            path: "/v1/apis/{apiId}/environmentVariables", 
            httpMethod: .GET, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Retrieves the list of environmental variable key-value pairs associated with an API by its ID value.
    ///
    /// Parameters:
    ///   - apiId: The ID of the API from which the environmental variable list will be retrieved.
    ///   - logger: Logger use during operation
    @inlinable
    public func getGraphqlApiEnvironmentVariables(
        apiId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> GetGraphqlApiEnvironmentVariablesResponse {
        let input = GetGraphqlApiEnvironmentVariablesRequest(
            apiId: apiId
        )
        return try await self.getGraphqlApiEnvironmentVariables(input, logger: logger)
    }

    /// Retrieves the introspection schema for a GraphQL API.
    @Sendable
    @inlinable
    public func getIntrospectionSchema(_ input: GetIntrospectionSchemaRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> GetIntrospectionSchemaResponse {
        try await self.client.execute(
            operation: "GetIntrospectionSchema", 
            path: "/v1/apis/{apiId}/schema", 
            httpMethod: .GET, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Retrieves the introspection schema for a GraphQL API.
    ///
    /// Parameters:
    ///   - apiId: The API ID.
    ///   - format: The schema format: SDL or JSON.
    ///   - includeDirectives: A flag that specifies whether the schema introspection should contain directives.
    ///   - logger: Logger use during operation
    @inlinable
    public func getIntrospectionSchema(
        apiId: String,
        format: OutputType,
        includeDirectives: Bool? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> GetIntrospectionSchemaResponse {
        let input = GetIntrospectionSchemaRequest(
            apiId: apiId, 
            format: format, 
            includeDirectives: includeDirectives
        )
        return try await self.getIntrospectionSchema(input, logger: logger)
    }

    /// Retrieves a Resolver object.
    @Sendable
    @inlinable
    public func getResolver(_ input: GetResolverRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> GetResolverResponse {
        try await self.client.execute(
            operation: "GetResolver", 
            path: "/v1/apis/{apiId}/types/{typeName}/resolvers/{fieldName}", 
            httpMethod: .GET, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Retrieves a Resolver object.
    ///
    /// Parameters:
    ///   - apiId: The API ID.
    ///   - fieldName: The resolver field name.
    ///   - typeName: The resolver type name.
    ///   - logger: Logger use during operation
    @inlinable
    public func getResolver(
        apiId: String,
        fieldName: String,
        typeName: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> GetResolverResponse {
        let input = GetResolverRequest(
            apiId: apiId, 
            fieldName: fieldName, 
            typeName: typeName
        )
        return try await self.getResolver(input, logger: logger)
    }

    /// Retrieves the current status of a schema creation operation.
    @Sendable
    @inlinable
    public func getSchemaCreationStatus(_ input: GetSchemaCreationStatusRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> GetSchemaCreationStatusResponse {
        try await self.client.execute(
            operation: "GetSchemaCreationStatus", 
            path: "/v1/apis/{apiId}/schemacreation", 
            httpMethod: .GET, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Retrieves the current status of a schema creation operation.
    ///
    /// Parameters:
    ///   - apiId: The API ID.
    ///   - logger: Logger use during operation
    @inlinable
    public func getSchemaCreationStatus(
        apiId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> GetSchemaCreationStatusResponse {
        let input = GetSchemaCreationStatusRequest(
            apiId: apiId
        )
        return try await self.getSchemaCreationStatus(input, logger: logger)
    }

    /// Retrieves a SourceApiAssociation object.
    @Sendable
    @inlinable
    public func getSourceApiAssociation(_ input: GetSourceApiAssociationRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> GetSourceApiAssociationResponse {
        try await self.client.execute(
            operation: "GetSourceApiAssociation", 
            path: "/v1/mergedApis/{mergedApiIdentifier}/sourceApiAssociations/{associationId}", 
            httpMethod: .GET, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Retrieves a SourceApiAssociation object.
    ///
    /// Parameters:
    ///   - associationId: The ID generated by the AppSync service for the source API association.
    ///   - mergedApiIdentifier: The identifier of the AppSync Merged API. This is generated by the AppSync service. In most cases, Merged APIs (especially in your account) only require the API ID value or ARN of the merged API. However, Merged APIs in other accounts (cross-account use cases) strictly require the full resource ARN of the merged API.
    ///   - logger: Logger use during operation
    @inlinable
    public func getSourceApiAssociation(
        associationId: String,
        mergedApiIdentifier: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> GetSourceApiAssociationResponse {
        let input = GetSourceApiAssociationRequest(
            associationId: associationId, 
            mergedApiIdentifier: mergedApiIdentifier
        )
        return try await self.getSourceApiAssociation(input, logger: logger)
    }

    /// Retrieves a Type object.
    @Sendable
    @inlinable
    public func getType(_ input: GetTypeRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> GetTypeResponse {
        try await self.client.execute(
            operation: "GetType", 
            path: "/v1/apis/{apiId}/types/{typeName}", 
            httpMethod: .GET, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Retrieves a Type object.
    ///
    /// Parameters:
    ///   - apiId: The API ID.
    ///   - format: The type format: SDL or JSON.
    ///   - typeName: The type name.
    ///   - logger: Logger use during operation
    @inlinable
    public func getType(
        apiId: String,
        format: TypeDefinitionFormat,
        typeName: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> GetTypeResponse {
        let input = GetTypeRequest(
            apiId: apiId, 
            format: format, 
            typeName: typeName
        )
        return try await self.getType(input, logger: logger)
    }

    /// Lists the API keys for a given API.  API keys are deleted automatically 60 days after they expire. However, they may still be included in the response until they have actually been deleted. You can safely call DeleteApiKey to manually delete a key before it's automatically deleted.
    @Sendable
    @inlinable
    public func listApiKeys(_ input: ListApiKeysRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> ListApiKeysResponse {
        try await self.client.execute(
            operation: "ListApiKeys", 
            path: "/v1/apis/{apiId}/apikeys", 
            httpMethod: .GET, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Lists the API keys for a given API.  API keys are deleted automatically 60 days after they expire. However, they may still be included in the response until they have actually been deleted. You can safely call DeleteApiKey to manually delete a key before it's automatically deleted.
    ///
    /// Parameters:
    ///   - apiId: The API ID.
    ///   - maxResults: The maximum number of results that you want the request to return.
    ///   - nextToken: An identifier that was returned from the previous call to this operation, which you can use to return the next set of items in the list.
    ///   - logger: Logger use during operation
    @inlinable
    public func listApiKeys(
        apiId: String,
        maxResults: Int? = nil,
        nextToken: String? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> ListApiKeysResponse {
        let input = ListApiKeysRequest(
            apiId: apiId, 
            maxResults: maxResults, 
            nextToken: nextToken
        )
        return try await self.listApiKeys(input, logger: logger)
    }

    /// Lists the APIs in your AppSync account.  ListApis returns only the high level API details. For more detailed information about an API, use GetApi.
    @Sendable
    @inlinable
    public func listApis(_ input: ListApisRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> ListApisResponse {
        try await self.client.execute(
            operation: "ListApis", 
            path: "/v2/apis", 
            httpMethod: .GET, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Lists the APIs in your AppSync account.  ListApis returns only the high level API details. For more detailed information about an API, use GetApi.
    ///
    /// Parameters:
    ///   - maxResults: The maximum number of results that you want the request to return.
    ///   - nextToken: An identifier that was returned from the previous call to this operation, which you can use to return the next set of items in the list.
    ///   - logger: Logger use during operation
    @inlinable
    public func listApis(
        maxResults: Int? = nil,
        nextToken: String? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> ListApisResponse {
        let input = ListApisRequest(
            maxResults: maxResults, 
            nextToken: nextToken
        )
        return try await self.listApis(input, logger: logger)
    }

    /// Lists the channel namespaces for a specified Api.  ListChannelNamespaces returns only high level details for the channel namespace. To retrieve code handlers, use GetChannelNamespace.
    @Sendable
    @inlinable
    public func listChannelNamespaces(_ input: ListChannelNamespacesRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> ListChannelNamespacesResponse {
        try await self.client.execute(
            operation: "ListChannelNamespaces", 
            path: "/v2/apis/{apiId}/channelNamespaces", 
            httpMethod: .GET, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Lists the channel namespaces for a specified Api.  ListChannelNamespaces returns only high level details for the channel namespace. To retrieve code handlers, use GetChannelNamespace.
    ///
    /// Parameters:
    ///   - apiId: The Api ID.
    ///   - maxResults: The maximum number of results that you want the request to return.
    ///   - nextToken: An identifier that was returned from the previous call to this operation, which you can use to return the next set of items in the list.
    ///   - logger: Logger use during operation
    @inlinable
    public func listChannelNamespaces(
        apiId: String,
        maxResults: Int? = nil,
        nextToken: String? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> ListChannelNamespacesResponse {
        let input = ListChannelNamespacesRequest(
            apiId: apiId, 
            maxResults: maxResults, 
            nextToken: nextToken
        )
        return try await self.listChannelNamespaces(input, logger: logger)
    }

    /// Lists the data sources for a given API.
    @Sendable
    @inlinable
    public func listDataSources(_ input: ListDataSourcesRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> ListDataSourcesResponse {
        try await self.client.execute(
            operation: "ListDataSources", 
            path: "/v1/apis/{apiId}/datasources", 
            httpMethod: .GET, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Lists the data sources for a given API.
    ///
    /// Parameters:
    ///   - apiId: The API ID.
    ///   - maxResults: The maximum number of results that you want the request to return.
    ///   - nextToken: An identifier that was returned from the previous call to this operation, which you can use to return the next set of items in the list.
    ///   - logger: Logger use during operation
    @inlinable
    public func listDataSources(
        apiId: String,
        maxResults: Int? = nil,
        nextToken: String? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> ListDataSourcesResponse {
        let input = ListDataSourcesRequest(
            apiId: apiId, 
            maxResults: maxResults, 
            nextToken: nextToken
        )
        return try await self.listDataSources(input, logger: logger)
    }

    /// Lists multiple custom domain names.
    @Sendable
    @inlinable
    public func listDomainNames(_ input: ListDomainNamesRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> ListDomainNamesResponse {
        try await self.client.execute(
            operation: "ListDomainNames", 
            path: "/v1/domainnames", 
            httpMethod: .GET, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Lists multiple custom domain names.
    ///
    /// Parameters:
    ///   - maxResults: The maximum number of results that you want the request to return.
    ///   - nextToken: An identifier that was returned from the previous call to this operation, which you can use to return the next set of items in the list.
    ///   - logger: Logger use during operation
    @inlinable
    public func listDomainNames(
        maxResults: Int? = nil,
        nextToken: String? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> ListDomainNamesResponse {
        let input = ListDomainNamesRequest(
            maxResults: maxResults, 
            nextToken: nextToken
        )
        return try await self.listDomainNames(input, logger: logger)
    }

    /// List multiple functions.
    @Sendable
    @inlinable
    public func listFunctions(_ input: ListFunctionsRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> ListFunctionsResponse {
        try await self.client.execute(
            operation: "ListFunctions", 
            path: "/v1/apis/{apiId}/functions", 
            httpMethod: .GET, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// List multiple functions.
    ///
    /// Parameters:
    ///   - apiId: The GraphQL API ID.
    ///   - maxResults: The maximum number of results that you want the request to return.
    ///   - nextToken: An identifier that was returned from the previous call to this operation, which you can use to return the next set of items in the list.
    ///   - logger: Logger use during operation
    @inlinable
    public func listFunctions(
        apiId: String,
        maxResults: Int? = nil,
        nextToken: String? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> ListFunctionsResponse {
        let input = ListFunctionsRequest(
            apiId: apiId, 
            maxResults: maxResults, 
            nextToken: nextToken
        )
        return try await self.listFunctions(input, logger: logger)
    }

    /// Lists your GraphQL APIs.
    @Sendable
    @inlinable
    public func listGraphqlApis(_ input: ListGraphqlApisRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> ListGraphqlApisResponse {
        try await self.client.execute(
            operation: "ListGraphqlApis", 
            path: "/v1/apis", 
            httpMethod: .GET, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Lists your GraphQL APIs.
    ///
    /// Parameters:
    ///   - apiType: The value that indicates whether the GraphQL API is a standard API (GRAPHQL) or merged API (MERGED).
    ///   - maxResults: The maximum number of results that you want the request to return.
    ///   - nextToken: An identifier that was returned from the previous call to this operation, which you can use to return the next set of items in the list.
    ///   - owner: The account owner of the GraphQL API.
    ///   - logger: Logger use during operation
    @inlinable
    public func listGraphqlApis(
        apiType: GraphQLApiType? = nil,
        maxResults: Int? = nil,
        nextToken: String? = nil,
        owner: Ownership? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> ListGraphqlApisResponse {
        let input = ListGraphqlApisRequest(
            apiType: apiType, 
            maxResults: maxResults, 
            nextToken: nextToken, 
            owner: owner
        )
        return try await self.listGraphqlApis(input, logger: logger)
    }

    /// Lists the resolvers for a given API and type.
    @Sendable
    @inlinable
    public func listResolvers(_ input: ListResolversRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> ListResolversResponse {
        try await self.client.execute(
            operation: "ListResolvers", 
            path: "/v1/apis/{apiId}/types/{typeName}/resolvers", 
            httpMethod: .GET, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Lists the resolvers for a given API and type.
    ///
    /// Parameters:
    ///   - apiId: The API ID.
    ///   - maxResults: The maximum number of results that you want the request to return.
    ///   - nextToken: An identifier that was returned from the previous call to this operation, which you can use to return the next set of items in the list.
    ///   - typeName: The type name.
    ///   - logger: Logger use during operation
    @inlinable
    public func listResolvers(
        apiId: String,
        maxResults: Int? = nil,
        nextToken: String? = nil,
        typeName: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> ListResolversResponse {
        let input = ListResolversRequest(
            apiId: apiId, 
            maxResults: maxResults, 
            nextToken: nextToken, 
            typeName: typeName
        )
        return try await self.listResolvers(input, logger: logger)
    }

    /// List the resolvers that are associated with a specific function.
    @Sendable
    @inlinable
    public func listResolversByFunction(_ input: ListResolversByFunctionRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> ListResolversByFunctionResponse {
        try await self.client.execute(
            operation: "ListResolversByFunction", 
            path: "/v1/apis/{apiId}/functions/{functionId}/resolvers", 
            httpMethod: .GET, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// List the resolvers that are associated with a specific function.
    ///
    /// Parameters:
    ///   - apiId: The API ID.
    ///   - functionId: The function ID.
    ///   - maxResults: The maximum number of results that you want the request to return.
    ///   - nextToken: An identifier that was returned from the previous call to this operation, which you can use to return the next set of items in the list.
    ///   - logger: Logger use during operation
    @inlinable
    public func listResolversByFunction(
        apiId: String,
        functionId: String,
        maxResults: Int? = nil,
        nextToken: String? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> ListResolversByFunctionResponse {
        let input = ListResolversByFunctionRequest(
            apiId: apiId, 
            functionId: functionId, 
            maxResults: maxResults, 
            nextToken: nextToken
        )
        return try await self.listResolversByFunction(input, logger: logger)
    }

    /// Lists the SourceApiAssociationSummary data.
    @Sendable
    @inlinable
    public func listSourceApiAssociations(_ input: ListSourceApiAssociationsRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> ListSourceApiAssociationsResponse {
        try await self.client.execute(
            operation: "ListSourceApiAssociations", 
            path: "/v1/apis/{apiId}/sourceApiAssociations", 
            httpMethod: .GET, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Lists the SourceApiAssociationSummary data.
    ///
    /// Parameters:
    ///   - apiId: The API ID.
    ///   - maxResults: The maximum number of results that you want the request to return.
    ///   - nextToken: An identifier that was returned from the previous call to this operation, which you can use to return the next set of items in the list.
    ///   - logger: Logger use during operation
    @inlinable
    public func listSourceApiAssociations(
        apiId: String,
        maxResults: Int? = nil,
        nextToken: String? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> ListSourceApiAssociationsResponse {
        let input = ListSourceApiAssociationsRequest(
            apiId: apiId, 
            maxResults: maxResults, 
            nextToken: nextToken
        )
        return try await self.listSourceApiAssociations(input, logger: logger)
    }

    /// Lists the tags for a resource.
    @Sendable
    @inlinable
    public func listTagsForResource(_ input: ListTagsForResourceRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> ListTagsForResourceResponse {
        try await self.client.execute(
            operation: "ListTagsForResource", 
            path: "/v1/tags/{resourceArn}", 
            httpMethod: .GET, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Lists the tags for a resource.
    ///
    /// Parameters:
    ///   - resourceArn: The GraphqlApi Amazon Resource Name (ARN).
    ///   - logger: Logger use during operation
    @inlinable
    public func listTagsForResource(
        resourceArn: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> ListTagsForResourceResponse {
        let input = ListTagsForResourceRequest(
            resourceArn: resourceArn
        )
        return try await self.listTagsForResource(input, logger: logger)
    }

    /// Lists the types for a given API.
    @Sendable
    @inlinable
    public func listTypes(_ input: ListTypesRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> ListTypesResponse {
        try await self.client.execute(
            operation: "ListTypes", 
            path: "/v1/apis/{apiId}/types", 
            httpMethod: .GET, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Lists the types for a given API.
    ///
    /// Parameters:
    ///   - apiId: The API ID.
    ///   - format: The type format: SDL or JSON.
    ///   - maxResults: The maximum number of results that you want the request to return.
    ///   - nextToken: An identifier that was returned from the previous call to this operation, which you can use to return the next set of items in the list.
    ///   - logger: Logger use during operation
    @inlinable
    public func listTypes(
        apiId: String,
        format: TypeDefinitionFormat,
        maxResults: Int? = nil,
        nextToken: String? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> ListTypesResponse {
        let input = ListTypesRequest(
            apiId: apiId, 
            format: format, 
            maxResults: maxResults, 
            nextToken: nextToken
        )
        return try await self.listTypes(input, logger: logger)
    }

    /// Lists Type objects by the source API association ID.
    @Sendable
    @inlinable
    public func listTypesByAssociation(_ input: ListTypesByAssociationRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> ListTypesByAssociationResponse {
        try await self.client.execute(
            operation: "ListTypesByAssociation", 
            path: "/v1/mergedApis/{mergedApiIdentifier}/sourceApiAssociations/{associationId}/types", 
            httpMethod: .GET, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Lists Type objects by the source API association ID.
    ///
    /// Parameters:
    ///   - associationId: The ID generated by the AppSync service for the source API association.
    ///   - format: The format type.
    ///   - maxResults: The maximum number of results that you want the request to return.
    ///   - mergedApiIdentifier: The identifier of the AppSync Merged API. This is generated by the AppSync service. In most cases, Merged APIs (especially in your account) only require the API ID value or ARN of the merged API. However, Merged APIs in other accounts (cross-account use cases) strictly require the full resource ARN of the merged API.
    ///   - nextToken: An identifier that was returned from the previous call to this operation, which you can use to return the next set of items in the list.
    ///   - logger: Logger use during operation
    @inlinable
    public func listTypesByAssociation(
        associationId: String,
        format: TypeDefinitionFormat,
        maxResults: Int? = nil,
        mergedApiIdentifier: String,
        nextToken: String? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> ListTypesByAssociationResponse {
        let input = ListTypesByAssociationRequest(
            associationId: associationId, 
            format: format, 
            maxResults: maxResults, 
            mergedApiIdentifier: mergedApiIdentifier, 
            nextToken: nextToken
        )
        return try await self.listTypesByAssociation(input, logger: logger)
    }

    /// Creates a list of environmental variables in an API by its ID value.  When creating an environmental variable, it must follow the constraints below:   Both JavaScript and VTL templates support environmental variables.   Environmental variables are not evaluated before function invocation.   Environmental variables only support string values.   Any defined value in an environmental variable is considered a string literal and not expanded.   Variable evaluations should ideally be performed in the function code.   When creating an environmental variable key-value pair, it must follow the additional constraints below:   Keys must begin with a letter.   Keys must be at least two characters long.   Keys can only contain letters, numbers, and the underscore character (_).   Values can be up to 512 characters long.   You can configure up to 50 key-value pairs in a GraphQL API.   You can create a list of environmental variables by adding it to the environmentVariables payload as a list in the format {"key1":"value1","key2":"value2", …}. Note that each call of the PutGraphqlApiEnvironmentVariables action will result in the overwriting of the existing environmental variable list of that API. This means the existing environmental variables will be lost. To avoid this, you must include all existing and new environmental variables in the list each time you call this action.
    @Sendable
    @inlinable
    public func putGraphqlApiEnvironmentVariables(_ input: PutGraphqlApiEnvironmentVariablesRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> PutGraphqlApiEnvironmentVariablesResponse {
        try await self.client.execute(
            operation: "PutGraphqlApiEnvironmentVariables", 
            path: "/v1/apis/{apiId}/environmentVariables", 
            httpMethod: .PUT, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Creates a list of environmental variables in an API by its ID value.  When creating an environmental variable, it must follow the constraints below:   Both JavaScript and VTL templates support environmental variables.   Environmental variables are not evaluated before function invocation.   Environmental variables only support string values.   Any defined value in an environmental variable is considered a string literal and not expanded.   Variable evaluations should ideally be performed in the function code.   When creating an environmental variable key-value pair, it must follow the additional constraints below:   Keys must begin with a letter.   Keys must be at least two characters long.   Keys can only contain letters, numbers, and the underscore character (_).   Values can be up to 512 characters long.   You can configure up to 50 key-value pairs in a GraphQL API.   You can create a list of environmental variables by adding it to the environmentVariables payload as a list in the format {"key1":"value1","key2":"value2", …}. Note that each call of the PutGraphqlApiEnvironmentVariables action will result in the overwriting of the existing environmental variable list of that API. This means the existing environmental variables will be lost. To avoid this, you must include all existing and new environmental variables in the list each time you call this action.
    ///
    /// Parameters:
    ///   - apiId: The ID of the API to which the environmental variable list will be written.
    ///   - environmentVariables: The list of environmental variables to add to the API. When creating an environmental variable key-value pair, it must follow the additional constraints below:   Keys must begin with a letter.   Keys must be at least two characters long.   Keys can only contain letters, numbers, and the underscore character (_).   Values can be up to 512 characters long.   You can configure up to 50 key-value pairs in a GraphQL API.   You can create a list of environmental variables by adding it to the environmentVariables payload as a list in the format {"key1":"value1","key2":"value2", …}. Note that each call of the PutGraphqlApiEnvironmentVariables action will result in the overwriting of the existing environmental variable list of that API. This means the existing environmental variables will be lost. To avoid this, you must include all existing and new environmental variables in the list each time you call this action.
    ///   - logger: Logger use during operation
    @inlinable
    public func putGraphqlApiEnvironmentVariables(
        apiId: String,
        environmentVariables: [String: String],
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> PutGraphqlApiEnvironmentVariablesResponse {
        let input = PutGraphqlApiEnvironmentVariablesRequest(
            apiId: apiId, 
            environmentVariables: environmentVariables
        )
        return try await self.putGraphqlApiEnvironmentVariables(input, logger: logger)
    }

    /// Creates a new introspection. Returns the introspectionId of the new introspection after its creation.
    @Sendable
    @inlinable
    public func startDataSourceIntrospection(_ input: StartDataSourceIntrospectionRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> StartDataSourceIntrospectionResponse {
        try await self.client.execute(
            operation: "StartDataSourceIntrospection", 
            path: "/v1/datasources/introspections", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Creates a new introspection. Returns the introspectionId of the new introspection after its creation.
    ///
    /// Parameters:
    ///   - rdsDataApiConfig: The rdsDataApiConfig object data.
    ///   - logger: Logger use during operation
    @inlinable
    public func startDataSourceIntrospection(
        rdsDataApiConfig: RdsDataApiConfig? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> StartDataSourceIntrospectionResponse {
        let input = StartDataSourceIntrospectionRequest(
            rdsDataApiConfig: rdsDataApiConfig
        )
        return try await self.startDataSourceIntrospection(input, logger: logger)
    }

    /// Adds a new schema to your GraphQL API. This operation is asynchronous. Use  to determine when it has completed.
    @Sendable
    @inlinable
    public func startSchemaCreation(_ input: StartSchemaCreationRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> StartSchemaCreationResponse {
        try await self.client.execute(
            operation: "StartSchemaCreation", 
            path: "/v1/apis/{apiId}/schemacreation", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Adds a new schema to your GraphQL API. This operation is asynchronous. Use  to determine when it has completed.
    ///
    /// Parameters:
    ///   - apiId: The API ID.
    ///   - definition: The schema definition, in GraphQL schema language format.
    ///   - logger: Logger use during operation
    @inlinable
    public func startSchemaCreation(
        apiId: String,
        definition: AWSBase64Data,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> StartSchemaCreationResponse {
        let input = StartSchemaCreationRequest(
            apiId: apiId, 
            definition: definition
        )
        return try await self.startSchemaCreation(input, logger: logger)
    }

    /// Initiates a merge operation. Returns a status that shows the result of the merge operation.
    @Sendable
    @inlinable
    public func startSchemaMerge(_ input: StartSchemaMergeRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> StartSchemaMergeResponse {
        try await self.client.execute(
            operation: "StartSchemaMerge", 
            path: "/v1/mergedApis/{mergedApiIdentifier}/sourceApiAssociations/{associationId}/merge", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Initiates a merge operation. Returns a status that shows the result of the merge operation.
    ///
    /// Parameters:
    ///   - associationId: The ID generated by the AppSync service for the source API association.
    ///   - mergedApiIdentifier: The identifier of the AppSync Merged API. This is generated by the AppSync service. In most cases, Merged APIs (especially in your account) only require the API ID value or ARN of the merged API. However, Merged APIs in other accounts (cross-account use cases) strictly require the full resource ARN of the merged API.
    ///   - logger: Logger use during operation
    @inlinable
    public func startSchemaMerge(
        associationId: String,
        mergedApiIdentifier: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> StartSchemaMergeResponse {
        let input = StartSchemaMergeRequest(
            associationId: associationId, 
            mergedApiIdentifier: mergedApiIdentifier
        )
        return try await self.startSchemaMerge(input, logger: logger)
    }

    /// Tags a resource with user-supplied tags.
    @Sendable
    @inlinable
    public func tagResource(_ input: TagResourceRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> TagResourceResponse {
        try await self.client.execute(
            operation: "TagResource", 
            path: "/v1/tags/{resourceArn}", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Tags a resource with user-supplied tags.
    ///
    /// Parameters:
    ///   - resourceArn: The GraphqlApi Amazon Resource Name (ARN).
    ///   - tags: A TagMap object.
    ///   - logger: Logger use during operation
    @inlinable
    public func tagResource(
        resourceArn: String,
        tags: [String: String],
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> TagResourceResponse {
        let input = TagResourceRequest(
            resourceArn: resourceArn, 
            tags: tags
        )
        return try await self.tagResource(input, logger: logger)
    }

    /// Untags a resource.
    @Sendable
    @inlinable
    public func untagResource(_ input: UntagResourceRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> UntagResourceResponse {
        try await self.client.execute(
            operation: "UntagResource", 
            path: "/v1/tags/{resourceArn}", 
            httpMethod: .DELETE, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Untags a resource.
    ///
    /// Parameters:
    ///   - resourceArn: The GraphqlApi Amazon Resource Name (ARN).
    ///   - tagKeys: A list of TagKey objects.
    ///   - logger: Logger use during operation
    @inlinable
    public func untagResource(
        resourceArn: String,
        tagKeys: [String],
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> UntagResourceResponse {
        let input = UntagResourceRequest(
            resourceArn: resourceArn, 
            tagKeys: tagKeys
        )
        return try await self.untagResource(input, logger: logger)
    }

    /// Updates an Api.
    @Sendable
    @inlinable
    public func updateApi(_ input: UpdateApiRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> UpdateApiResponse {
        try await self.client.execute(
            operation: "UpdateApi", 
            path: "/v2/apis/{apiId}", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Updates an Api.
    ///
    /// Parameters:
    ///   - apiId: The Api ID.
    ///   - eventConfig: The new event configuration. This includes the default authorization configuration for connecting, publishing, and subscribing to an Event API.
    ///   - name: The name of the Api.
    ///   - ownerContact: The owner contact information for the Api.
    ///   - logger: Logger use during operation
    @inlinable
    public func updateApi(
        apiId: String,
        eventConfig: EventConfig? = nil,
        name: String,
        ownerContact: String? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> UpdateApiResponse {
        let input = UpdateApiRequest(
            apiId: apiId, 
            eventConfig: eventConfig, 
            name: name, 
            ownerContact: ownerContact
        )
        return try await self.updateApi(input, logger: logger)
    }

    /// Updates the cache for the GraphQL API.
    @Sendable
    @inlinable
    public func updateApiCache(_ input: UpdateApiCacheRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> UpdateApiCacheResponse {
        try await self.client.execute(
            operation: "UpdateApiCache", 
            path: "/v1/apis/{apiId}/ApiCaches/update", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Updates the cache for the GraphQL API.
    ///
    /// Parameters:
    ///   - apiCachingBehavior: Caching behavior.    FULL_REQUEST_CACHING: All requests from the same user are cached. Individual resolvers are automatically cached. All API calls will try to return responses from the cache.    PER_RESOLVER_CACHING: Individual resolvers that you specify are cached.    OPERATION_LEVEL_CACHING: Full requests are cached together and returned without executing resolvers.
    ///   - apiId: The GraphQL API ID.
    ///   - healthMetricsConfig: Controls how cache health metrics will be emitted to CloudWatch. Cache health metrics include:   NetworkBandwidthOutAllowanceExceeded: The network packets dropped because the throughput exceeded the aggregated bandwidth limit. This is useful for diagnosing bottlenecks in a cache configuration.   EngineCPUUtilization: The CPU utilization (percentage) allocated to the Redis process. This is useful for diagnosing bottlenecks in a cache configuration.   Metrics will be recorded by API ID. You can set the value to ENABLED or DISABLED.
    ///   - ttl: TTL in seconds for cache entries. Valid values are 1–3,600 seconds.
    ///   - type: The cache instance type. Valid values are     SMALL     MEDIUM     LARGE     XLARGE     LARGE_2X     LARGE_4X     LARGE_8X (not available in all regions)    LARGE_12X    Historically, instance types were identified by an EC2-style value. As of July 2020, this is deprecated, and the generic identifiers above should be used. The following legacy instance types are available, but their use is discouraged:    T2_SMALL: A t2.small instance type.    T2_MEDIUM: A t2.medium instance type.    R4_LARGE: A r4.large instance type.    R4_XLARGE: A r4.xlarge instance type.    R4_2XLARGE: A r4.2xlarge instance type.    R4_4XLARGE: A r4.4xlarge instance type.    R4_8XLARGE: A r4.8xlarge instance type.
    ///   - logger: Logger use during operation
    @inlinable
    public func updateApiCache(
        apiCachingBehavior: ApiCachingBehavior,
        apiId: String,
        healthMetricsConfig: CacheHealthMetricsConfig? = nil,
        ttl: Int64 = 0,
        type: ApiCacheType,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> UpdateApiCacheResponse {
        let input = UpdateApiCacheRequest(
            apiCachingBehavior: apiCachingBehavior, 
            apiId: apiId, 
            healthMetricsConfig: healthMetricsConfig, 
            ttl: ttl, 
            type: type
        )
        return try await self.updateApiCache(input, logger: logger)
    }

    /// Updates an API key. You can update the key as long as it's not deleted.
    @Sendable
    @inlinable
    public func updateApiKey(_ input: UpdateApiKeyRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> UpdateApiKeyResponse {
        try await self.client.execute(
            operation: "UpdateApiKey", 
            path: "/v1/apis/{apiId}/apikeys/{id}", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Updates an API key. You can update the key as long as it's not deleted.
    ///
    /// Parameters:
    ///   - apiId: The ID for the GraphQL API.
    ///   - description: A description of the purpose of the API key.
    ///   - expires: From the update time, the time after which the API key expires. The date is represented as seconds since the epoch. For more information, see .
    ///   - id: The API key ID.
    ///   - logger: Logger use during operation
    @inlinable
    public func updateApiKey(
        apiId: String,
        description: String? = nil,
        expires: Int64? = nil,
        id: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> UpdateApiKeyResponse {
        let input = UpdateApiKeyRequest(
            apiId: apiId, 
            description: description, 
            expires: expires, 
            id: id
        )
        return try await self.updateApiKey(input, logger: logger)
    }

    /// Updates a ChannelNamespace associated with an Api.
    @Sendable
    @inlinable
    public func updateChannelNamespace(_ input: UpdateChannelNamespaceRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> UpdateChannelNamespaceResponse {
        try await self.client.execute(
            operation: "UpdateChannelNamespace", 
            path: "/v2/apis/{apiId}/channelNamespaces/{name}", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Updates a ChannelNamespace associated with an Api.
    ///
    /// Parameters:
    ///   - apiId: The Api ID.
    ///   - codeHandlers: The event handler functions that run custom business logic to process published events and subscribe requests.
    ///   - handlerConfigs: The configuration for the OnPublish and OnSubscribe handlers.
    ///   - name: The name of the ChannelNamespace.
    ///   - publishAuthModes: The authorization mode to use for publishing messages on the channel namespace. This configuration overrides the default Api authorization configuration.
    ///   - subscribeAuthModes: The authorization mode to use for subscribing to messages on the channel namespace. This configuration overrides the default Api authorization configuration.
    ///   - logger: Logger use during operation
    @inlinable
    public func updateChannelNamespace(
        apiId: String,
        codeHandlers: String? = nil,
        handlerConfigs: HandlerConfigs? = nil,
        name: String,
        publishAuthModes: [AuthMode]? = nil,
        subscribeAuthModes: [AuthMode]? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> UpdateChannelNamespaceResponse {
        let input = UpdateChannelNamespaceRequest(
            apiId: apiId, 
            codeHandlers: codeHandlers, 
            handlerConfigs: handlerConfigs, 
            name: name, 
            publishAuthModes: publishAuthModes, 
            subscribeAuthModes: subscribeAuthModes
        )
        return try await self.updateChannelNamespace(input, logger: logger)
    }

    /// Updates a DataSource object.
    @Sendable
    @inlinable
    public func updateDataSource(_ input: UpdateDataSourceRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> UpdateDataSourceResponse {
        try await self.client.execute(
            operation: "UpdateDataSource", 
            path: "/v1/apis/{apiId}/datasources/{name}", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Updates a DataSource object.
    ///
    /// Parameters:
    ///   - apiId: The API ID.
    ///   - description: The new description for the data source.
    ///   - dynamodbConfig: The new Amazon DynamoDB configuration.
    ///   - elasticsearchConfig: The new OpenSearch configuration. As of September 2021, Amazon Elasticsearch service is Amazon OpenSearch Service. This configuration is deprecated. Instead, use UpdateDataSourceRequest$openSearchServiceConfig to update an OpenSearch data source.
    ///   - eventBridgeConfig: The new Amazon EventBridge settings.
    ///   - httpConfig: The new HTTP endpoint configuration.
    ///   - lambdaConfig: The new Lambda configuration.
    ///   - metricsConfig: Enables or disables enhanced data source metrics for specified data sources. Note that metricsConfig won't be used unless the dataSourceLevelMetricsBehavior value is set to PER_DATA_SOURCE_METRICS. If the dataSourceLevelMetricsBehavior is set to FULL_REQUEST_DATA_SOURCE_METRICS instead, metricsConfig will be ignored. However, you can still set its value.  metricsConfig can be ENABLED or DISABLED.
    ///   - name: The new name for the data source.
    ///   - openSearchServiceConfig: The new OpenSearch configuration.
    ///   - relationalDatabaseConfig: The new relational database configuration.
    ///   - serviceRoleArn: The new service role Amazon Resource Name (ARN) for the data source.
    ///   - type: The new data source type.
    ///   - logger: Logger use during operation
    @inlinable
    public func updateDataSource(
        apiId: String,
        description: String? = nil,
        dynamodbConfig: DynamodbDataSourceConfig? = nil,
        elasticsearchConfig: ElasticsearchDataSourceConfig? = nil,
        eventBridgeConfig: EventBridgeDataSourceConfig? = nil,
        httpConfig: HttpDataSourceConfig? = nil,
        lambdaConfig: LambdaDataSourceConfig? = nil,
        metricsConfig: DataSourceLevelMetricsConfig? = nil,
        name: String,
        openSearchServiceConfig: OpenSearchServiceDataSourceConfig? = nil,
        relationalDatabaseConfig: RelationalDatabaseDataSourceConfig? = nil,
        serviceRoleArn: String? = nil,
        type: DataSourceType,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> UpdateDataSourceResponse {
        let input = UpdateDataSourceRequest(
            apiId: apiId, 
            description: description, 
            dynamodbConfig: dynamodbConfig, 
            elasticsearchConfig: elasticsearchConfig, 
            eventBridgeConfig: eventBridgeConfig, 
            httpConfig: httpConfig, 
            lambdaConfig: lambdaConfig, 
            metricsConfig: metricsConfig, 
            name: name, 
            openSearchServiceConfig: openSearchServiceConfig, 
            relationalDatabaseConfig: relationalDatabaseConfig, 
            serviceRoleArn: serviceRoleArn, 
            type: type
        )
        return try await self.updateDataSource(input, logger: logger)
    }

    /// Updates a custom DomainName object.
    @Sendable
    @inlinable
    public func updateDomainName(_ input: UpdateDomainNameRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> UpdateDomainNameResponse {
        try await self.client.execute(
            operation: "UpdateDomainName", 
            path: "/v1/domainnames/{domainName}", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Updates a custom DomainName object.
    ///
    /// Parameters:
    ///   - description: A description of the DomainName.
    ///   - domainName: The domain name.
    ///   - logger: Logger use during operation
    @inlinable
    public func updateDomainName(
        description: String? = nil,
        domainName: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> UpdateDomainNameResponse {
        let input = UpdateDomainNameRequest(
            description: description, 
            domainName: domainName
        )
        return try await self.updateDomainName(input, logger: logger)
    }

    /// Updates a Function object.
    @Sendable
    @inlinable
    public func updateFunction(_ input: UpdateFunctionRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> UpdateFunctionResponse {
        try await self.client.execute(
            operation: "UpdateFunction", 
            path: "/v1/apis/{apiId}/functions/{functionId}", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Updates a Function object.
    ///
    /// Parameters:
    ///   - apiId: The GraphQL API ID.
    ///   - code: The function code that contains the request and response functions. When code is used, the runtime is required. The runtime value must be APPSYNC_JS.
    ///   - dataSourceName: The Function DataSource name.
    ///   - description: The Function description.
    ///   - functionId: The function ID.
    ///   - functionVersion: The version of the request mapping template. Currently, the supported value is 2018-05-29. Note that when using VTL and mapping templates, the functionVersion is required.
    ///   - maxBatchSize: The maximum batching size for a resolver.
    ///   - name: The Function name.
    ///   - requestMappingTemplate: The Function request mapping template. Functions support only the 2018-05-29 version of the request mapping template.
    ///   - responseMappingTemplate: The Function request mapping template.
    ///   - runtime: 
    ///   - syncConfig: 
    ///   - logger: Logger use during operation
    @inlinable
    public func updateFunction(
        apiId: String,
        code: String? = nil,
        dataSourceName: String,
        description: String? = nil,
        functionId: String,
        functionVersion: String? = nil,
        maxBatchSize: Int? = nil,
        name: String,
        requestMappingTemplate: String? = nil,
        responseMappingTemplate: String? = nil,
        runtime: AppSyncRuntime? = nil,
        syncConfig: SyncConfig? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> UpdateFunctionResponse {
        let input = UpdateFunctionRequest(
            apiId: apiId, 
            code: code, 
            dataSourceName: dataSourceName, 
            description: description, 
            functionId: functionId, 
            functionVersion: functionVersion, 
            maxBatchSize: maxBatchSize, 
            name: name, 
            requestMappingTemplate: requestMappingTemplate, 
            responseMappingTemplate: responseMappingTemplate, 
            runtime: runtime, 
            syncConfig: syncConfig
        )
        return try await self.updateFunction(input, logger: logger)
    }

    /// Updates a GraphqlApi object.
    @Sendable
    @inlinable
    public func updateGraphqlApi(_ input: UpdateGraphqlApiRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> UpdateGraphqlApiResponse {
        try await self.client.execute(
            operation: "UpdateGraphqlApi", 
            path: "/v1/apis/{apiId}", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Updates a GraphqlApi object.
    ///
    /// Parameters:
    ///   - additionalAuthenticationProviders: A list of additional authentication providers for the GraphqlApi API.
    ///   - apiId: The API ID.
    ///   - authenticationType: The new authentication type for the GraphqlApi object.
    ///   - enhancedMetricsConfig: The enhancedMetricsConfig object.
    ///   - introspectionConfig: Sets the value of the GraphQL API to enable (ENABLED) or disable (DISABLED) introspection. If no value is provided, the introspection configuration will be set to ENABLED by default. This field will produce an error if the operation attempts to use the introspection feature while this field is disabled. For more information about introspection, see GraphQL introspection.
    ///   - lambdaAuthorizerConfig: Configuration for Lambda function authorization.
    ///   - logConfig: The Amazon CloudWatch Logs configuration for the GraphqlApi object.
    ///   - mergedApiExecutionRoleArn: The Identity and Access Management service role ARN for a merged API. The AppSync service assumes this role on behalf of the Merged API to validate access to source APIs at runtime and to prompt the AUTO_MERGE to update the merged API endpoint with the source API changes automatically.
    ///   - name: The new name for the GraphqlApi object.
    ///   - openIDConnectConfig: The OpenID Connect configuration for the GraphqlApi object.
    ///   - ownerContact: The owner contact information for an API resource. This field accepts any string input with a length of 0 - 256 characters.
    ///   - queryDepthLimit: The maximum depth a query can have in a single request. Depth refers to the amount of nested levels allowed in the body of query. The default value is 0 (or unspecified), which indicates there's no depth limit. If you set a limit, it can be between 1 and 75 nested levels. This field will produce a limit error if the operation falls out of bounds. Note that fields can still be set to nullable or non-nullable. If a non-nullable field produces an error, the error will be thrown upwards to the first nullable field available.
    ///   - resolverCountLimit: The maximum number of resolvers that can be invoked in a single request. The default value is 0 (or unspecified), which will set the limit to 10000. When specified, the limit value can be between 1 and 10000. This field will produce a limit error if the operation falls out of bounds.
    ///   - userPoolConfig: The new Amazon Cognito user pool configuration for the ~GraphqlApi object.
    ///   - xrayEnabled: A flag indicating whether to use X-Ray tracing for the GraphqlApi.
    ///   - logger: Logger use during operation
    @inlinable
    public func updateGraphqlApi(
        additionalAuthenticationProviders: [AdditionalAuthenticationProvider]? = nil,
        apiId: String,
        authenticationType: AuthenticationType,
        enhancedMetricsConfig: EnhancedMetricsConfig? = nil,
        introspectionConfig: GraphQLApiIntrospectionConfig? = nil,
        lambdaAuthorizerConfig: LambdaAuthorizerConfig? = nil,
        logConfig: LogConfig? = nil,
        mergedApiExecutionRoleArn: String? = nil,
        name: String,
        openIDConnectConfig: OpenIDConnectConfig? = nil,
        ownerContact: String? = nil,
        queryDepthLimit: Int? = nil,
        resolverCountLimit: Int? = nil,
        userPoolConfig: UserPoolConfig? = nil,
        xrayEnabled: Bool? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> UpdateGraphqlApiResponse {
        let input = UpdateGraphqlApiRequest(
            additionalAuthenticationProviders: additionalAuthenticationProviders, 
            apiId: apiId, 
            authenticationType: authenticationType, 
            enhancedMetricsConfig: enhancedMetricsConfig, 
            introspectionConfig: introspectionConfig, 
            lambdaAuthorizerConfig: lambdaAuthorizerConfig, 
            logConfig: logConfig, 
            mergedApiExecutionRoleArn: mergedApiExecutionRoleArn, 
            name: name, 
            openIDConnectConfig: openIDConnectConfig, 
            ownerContact: ownerContact, 
            queryDepthLimit: queryDepthLimit, 
            resolverCountLimit: resolverCountLimit, 
            userPoolConfig: userPoolConfig, 
            xrayEnabled: xrayEnabled
        )
        return try await self.updateGraphqlApi(input, logger: logger)
    }

    /// Updates a Resolver object.
    @Sendable
    @inlinable
    public func updateResolver(_ input: UpdateResolverRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> UpdateResolverResponse {
        try await self.client.execute(
            operation: "UpdateResolver", 
            path: "/v1/apis/{apiId}/types/{typeName}/resolvers/{fieldName}", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Updates a Resolver object.
    ///
    /// Parameters:
    ///   - apiId: The API ID.
    ///   - cachingConfig: The caching configuration for the resolver.
    ///   - code: The resolver code that contains the request and response functions. When code is used, the runtime is required. The runtime value must be APPSYNC_JS.
    ///   - dataSourceName: The new data source name.
    ///   - fieldName: The new field name.
    ///   - kind: The resolver type.    UNIT: A UNIT resolver type. A UNIT resolver is the default resolver type. You can use a UNIT resolver to run a GraphQL query against a single data source.    PIPELINE: A PIPELINE resolver type. You can use a PIPELINE resolver to invoke a series of Function objects in a serial manner. You can use a pipeline resolver to run a GraphQL query against multiple data sources.
    ///   - maxBatchSize: The maximum batching size for a resolver.
    ///   - metricsConfig: Enables or disables enhanced resolver metrics for specified resolvers. Note that metricsConfig won't be used unless the resolverLevelMetricsBehavior value is set to PER_RESOLVER_METRICS. If the resolverLevelMetricsBehavior is set to FULL_REQUEST_RESOLVER_METRICS instead, metricsConfig will be ignored. However, you can still set its value.  metricsConfig can be ENABLED or DISABLED.
    ///   - pipelineConfig: The PipelineConfig.
    ///   - requestMappingTemplate: The new request mapping template. A resolver uses a request mapping template to convert a GraphQL expression into a format that a data source can understand. Mapping templates are written in Apache Velocity Template Language (VTL). VTL request mapping templates are optional when using an Lambda data source. For all other data sources, VTL request and response mapping templates are required.
    ///   - responseMappingTemplate: The new response mapping template.
    ///   - runtime: 
    ///   - syncConfig: The SyncConfig for a resolver attached to a versioned data source.
    ///   - typeName: The new type name.
    ///   - logger: Logger use during operation
    @inlinable
    public func updateResolver(
        apiId: String,
        cachingConfig: CachingConfig? = nil,
        code: String? = nil,
        dataSourceName: String? = nil,
        fieldName: String,
        kind: ResolverKind? = nil,
        maxBatchSize: Int? = nil,
        metricsConfig: ResolverLevelMetricsConfig? = nil,
        pipelineConfig: PipelineConfig? = nil,
        requestMappingTemplate: String? = nil,
        responseMappingTemplate: String? = nil,
        runtime: AppSyncRuntime? = nil,
        syncConfig: SyncConfig? = nil,
        typeName: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> UpdateResolverResponse {
        let input = UpdateResolverRequest(
            apiId: apiId, 
            cachingConfig: cachingConfig, 
            code: code, 
            dataSourceName: dataSourceName, 
            fieldName: fieldName, 
            kind: kind, 
            maxBatchSize: maxBatchSize, 
            metricsConfig: metricsConfig, 
            pipelineConfig: pipelineConfig, 
            requestMappingTemplate: requestMappingTemplate, 
            responseMappingTemplate: responseMappingTemplate, 
            runtime: runtime, 
            syncConfig: syncConfig, 
            typeName: typeName
        )
        return try await self.updateResolver(input, logger: logger)
    }

    /// Updates some of the configuration choices of a particular source API association.
    @Sendable
    @inlinable
    public func updateSourceApiAssociation(_ input: UpdateSourceApiAssociationRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> UpdateSourceApiAssociationResponse {
        try await self.client.execute(
            operation: "UpdateSourceApiAssociation", 
            path: "/v1/mergedApis/{mergedApiIdentifier}/sourceApiAssociations/{associationId}", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Updates some of the configuration choices of a particular source API association.
    ///
    /// Parameters:
    ///   - associationId: The ID generated by the AppSync service for the source API association.
    ///   - description: The description field.
    ///   - mergedApiIdentifier: The identifier of the AppSync Merged API. This is generated by the AppSync service. In most cases, Merged APIs (especially in your account) only require the API ID value or ARN of the merged API. However, Merged APIs in other accounts (cross-account use cases) strictly require the full resource ARN of the merged API.
    ///   - sourceApiAssociationConfig: The SourceApiAssociationConfig object data.
    ///   - logger: Logger use during operation
    @inlinable
    public func updateSourceApiAssociation(
        associationId: String,
        description: String? = nil,
        mergedApiIdentifier: String,
        sourceApiAssociationConfig: SourceApiAssociationConfig? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> UpdateSourceApiAssociationResponse {
        let input = UpdateSourceApiAssociationRequest(
            associationId: associationId, 
            description: description, 
            mergedApiIdentifier: mergedApiIdentifier, 
            sourceApiAssociationConfig: sourceApiAssociationConfig
        )
        return try await self.updateSourceApiAssociation(input, logger: logger)
    }

    /// Updates a Type object.
    @Sendable
    @inlinable
    public func updateType(_ input: UpdateTypeRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> UpdateTypeResponse {
        try await self.client.execute(
            operation: "UpdateType", 
            path: "/v1/apis/{apiId}/types/{typeName}", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Updates a Type object.
    ///
    /// Parameters:
    ///   - apiId: The API ID.
    ///   - definition: The new definition.
    ///   - format: The new type format: SDL or JSON.
    ///   - typeName: The new type name.
    ///   - logger: Logger use during operation
    @inlinable
    public func updateType(
        apiId: String,
        definition: String? = nil,
        format: TypeDefinitionFormat,
        typeName: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> UpdateTypeResponse {
        let input = UpdateTypeRequest(
            apiId: apiId, 
            definition: definition, 
            format: format, 
            typeName: typeName
        )
        return try await self.updateType(input, logger: logger)
    }
}

extension AppSync {
    /// Initializer required by `AWSService.with(middlewares:timeout:byteBufferAllocator:options)`. You are not able to use this initializer directly as there are not public
    /// initializers for `AWSServiceConfig.Patch`. Please use `AWSService.with(middlewares:timeout:byteBufferAllocator:options)` instead.
    public init(from: AppSync, patch: AWSServiceConfig.Patch) {
        self.client = from.client
        self.config = from.config.with(patch: patch)
    }
}

// MARK: Paginators

@available(macOS 10.15, iOS 13.0, tvOS 13.0, watchOS 6.0, *)
extension AppSync {
    /// Return PaginatorSequence for operation ``listApiKeys(_:logger:)``.
    ///
    /// - Parameters:
    ///   - input: Input for operation
    ///   - logger: Logger used for logging
    @inlinable
    public func listApiKeysPaginator(
        _ input: ListApiKeysRequest,
        logger: Logger = AWSClient.loggingDisabled
    ) -> AWSClient.PaginatorSequence<ListApiKeysRequest, ListApiKeysResponse> {
        return .init(
            input: input,
            command: self.listApiKeys,
            inputKey: \ListApiKeysRequest.nextToken,
            outputKey: \ListApiKeysResponse.nextToken,
            logger: logger
        )
    }
    /// Return PaginatorSequence for operation ``listApiKeys(_:logger:)``.
    ///
    /// - Parameters:
    ///   - apiId: The API ID.
    ///   - maxResults: The maximum number of results that you want the request to return.
    ///   - logger: Logger used for logging
    @inlinable
    public func listApiKeysPaginator(
        apiId: String,
        maxResults: Int? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) -> AWSClient.PaginatorSequence<ListApiKeysRequest, ListApiKeysResponse> {
        let input = ListApiKeysRequest(
            apiId: apiId, 
            maxResults: maxResults
        )
        return self.listApiKeysPaginator(input, logger: logger)
    }

    /// Return PaginatorSequence for operation ``listApis(_:logger:)``.
    ///
    /// - Parameters:
    ///   - input: Input for operation
    ///   - logger: Logger used for logging
    @inlinable
    public func listApisPaginator(
        _ input: ListApisRequest,
        logger: Logger = AWSClient.loggingDisabled
    ) -> AWSClient.PaginatorSequence<ListApisRequest, ListApisResponse> {
        return .init(
            input: input,
            command: self.listApis,
            inputKey: \ListApisRequest.nextToken,
            outputKey: \ListApisResponse.nextToken,
            logger: logger
        )
    }
    /// Return PaginatorSequence for operation ``listApis(_:logger:)``.
    ///
    /// - Parameters:
    ///   - maxResults: The maximum number of results that you want the request to return.
    ///   - logger: Logger used for logging
    @inlinable
    public func listApisPaginator(
        maxResults: Int? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) -> AWSClient.PaginatorSequence<ListApisRequest, ListApisResponse> {
        let input = ListApisRequest(
            maxResults: maxResults
        )
        return self.listApisPaginator(input, logger: logger)
    }

    /// Return PaginatorSequence for operation ``listChannelNamespaces(_:logger:)``.
    ///
    /// - Parameters:
    ///   - input: Input for operation
    ///   - logger: Logger used for logging
    @inlinable
    public func listChannelNamespacesPaginator(
        _ input: ListChannelNamespacesRequest,
        logger: Logger = AWSClient.loggingDisabled
    ) -> AWSClient.PaginatorSequence<ListChannelNamespacesRequest, ListChannelNamespacesResponse> {
        return .init(
            input: input,
            command: self.listChannelNamespaces,
            inputKey: \ListChannelNamespacesRequest.nextToken,
            outputKey: \ListChannelNamespacesResponse.nextToken,
            logger: logger
        )
    }
    /// Return PaginatorSequence for operation ``listChannelNamespaces(_:logger:)``.
    ///
    /// - Parameters:
    ///   - apiId: The Api ID.
    ///   - maxResults: The maximum number of results that you want the request to return.
    ///   - logger: Logger used for logging
    @inlinable
    public func listChannelNamespacesPaginator(
        apiId: String,
        maxResults: Int? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) -> AWSClient.PaginatorSequence<ListChannelNamespacesRequest, ListChannelNamespacesResponse> {
        let input = ListChannelNamespacesRequest(
            apiId: apiId, 
            maxResults: maxResults
        )
        return self.listChannelNamespacesPaginator(input, logger: logger)
    }

    /// Return PaginatorSequence for operation ``listDataSources(_:logger:)``.
    ///
    /// - Parameters:
    ///   - input: Input for operation
    ///   - logger: Logger used for logging
    @inlinable
    public func listDataSourcesPaginator(
        _ input: ListDataSourcesRequest,
        logger: Logger = AWSClient.loggingDisabled
    ) -> AWSClient.PaginatorSequence<ListDataSourcesRequest, ListDataSourcesResponse> {
        return .init(
            input: input,
            command: self.listDataSources,
            inputKey: \ListDataSourcesRequest.nextToken,
            outputKey: \ListDataSourcesResponse.nextToken,
            logger: logger
        )
    }
    /// Return PaginatorSequence for operation ``listDataSources(_:logger:)``.
    ///
    /// - Parameters:
    ///   - apiId: The API ID.
    ///   - maxResults: The maximum number of results that you want the request to return.
    ///   - logger: Logger used for logging
    @inlinable
    public func listDataSourcesPaginator(
        apiId: String,
        maxResults: Int? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) -> AWSClient.PaginatorSequence<ListDataSourcesRequest, ListDataSourcesResponse> {
        let input = ListDataSourcesRequest(
            apiId: apiId, 
            maxResults: maxResults
        )
        return self.listDataSourcesPaginator(input, logger: logger)
    }

    /// Return PaginatorSequence for operation ``listDomainNames(_:logger:)``.
    ///
    /// - Parameters:
    ///   - input: Input for operation
    ///   - logger: Logger used for logging
    @inlinable
    public func listDomainNamesPaginator(
        _ input: ListDomainNamesRequest,
        logger: Logger = AWSClient.loggingDisabled
    ) -> AWSClient.PaginatorSequence<ListDomainNamesRequest, ListDomainNamesResponse> {
        return .init(
            input: input,
            command: self.listDomainNames,
            inputKey: \ListDomainNamesRequest.nextToken,
            outputKey: \ListDomainNamesResponse.nextToken,
            logger: logger
        )
    }
    /// Return PaginatorSequence for operation ``listDomainNames(_:logger:)``.
    ///
    /// - Parameters:
    ///   - maxResults: The maximum number of results that you want the request to return.
    ///   - logger: Logger used for logging
    @inlinable
    public func listDomainNamesPaginator(
        maxResults: Int? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) -> AWSClient.PaginatorSequence<ListDomainNamesRequest, ListDomainNamesResponse> {
        let input = ListDomainNamesRequest(
            maxResults: maxResults
        )
        return self.listDomainNamesPaginator(input, logger: logger)
    }

    /// Return PaginatorSequence for operation ``listFunctions(_:logger:)``.
    ///
    /// - Parameters:
    ///   - input: Input for operation
    ///   - logger: Logger used for logging
    @inlinable
    public func listFunctionsPaginator(
        _ input: ListFunctionsRequest,
        logger: Logger = AWSClient.loggingDisabled
    ) -> AWSClient.PaginatorSequence<ListFunctionsRequest, ListFunctionsResponse> {
        return .init(
            input: input,
            command: self.listFunctions,
            inputKey: \ListFunctionsRequest.nextToken,
            outputKey: \ListFunctionsResponse.nextToken,
            logger: logger
        )
    }
    /// Return PaginatorSequence for operation ``listFunctions(_:logger:)``.
    ///
    /// - Parameters:
    ///   - apiId: The GraphQL API ID.
    ///   - maxResults: The maximum number of results that you want the request to return.
    ///   - logger: Logger used for logging
    @inlinable
    public func listFunctionsPaginator(
        apiId: String,
        maxResults: Int? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) -> AWSClient.PaginatorSequence<ListFunctionsRequest, ListFunctionsResponse> {
        let input = ListFunctionsRequest(
            apiId: apiId, 
            maxResults: maxResults
        )
        return self.listFunctionsPaginator(input, logger: logger)
    }

    /// Return PaginatorSequence for operation ``listGraphqlApis(_:logger:)``.
    ///
    /// - Parameters:
    ///   - input: Input for operation
    ///   - logger: Logger used for logging
    @inlinable
    public func listGraphqlApisPaginator(
        _ input: ListGraphqlApisRequest,
        logger: Logger = AWSClient.loggingDisabled
    ) -> AWSClient.PaginatorSequence<ListGraphqlApisRequest, ListGraphqlApisResponse> {
        return .init(
            input: input,
            command: self.listGraphqlApis,
            inputKey: \ListGraphqlApisRequest.nextToken,
            outputKey: \ListGraphqlApisResponse.nextToken,
            logger: logger
        )
    }
    /// Return PaginatorSequence for operation ``listGraphqlApis(_:logger:)``.
    ///
    /// - Parameters:
    ///   - apiType: The value that indicates whether the GraphQL API is a standard API (GRAPHQL) or merged API (MERGED).
    ///   - maxResults: The maximum number of results that you want the request to return.
    ///   - owner: The account owner of the GraphQL API.
    ///   - logger: Logger used for logging
    @inlinable
    public func listGraphqlApisPaginator(
        apiType: GraphQLApiType? = nil,
        maxResults: Int? = nil,
        owner: Ownership? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) -> AWSClient.PaginatorSequence<ListGraphqlApisRequest, ListGraphqlApisResponse> {
        let input = ListGraphqlApisRequest(
            apiType: apiType, 
            maxResults: maxResults, 
            owner: owner
        )
        return self.listGraphqlApisPaginator(input, logger: logger)
    }

    /// Return PaginatorSequence for operation ``listResolvers(_:logger:)``.
    ///
    /// - Parameters:
    ///   - input: Input for operation
    ///   - logger: Logger used for logging
    @inlinable
    public func listResolversPaginator(
        _ input: ListResolversRequest,
        logger: Logger = AWSClient.loggingDisabled
    ) -> AWSClient.PaginatorSequence<ListResolversRequest, ListResolversResponse> {
        return .init(
            input: input,
            command: self.listResolvers,
            inputKey: \ListResolversRequest.nextToken,
            outputKey: \ListResolversResponse.nextToken,
            logger: logger
        )
    }
    /// Return PaginatorSequence for operation ``listResolvers(_:logger:)``.
    ///
    /// - Parameters:
    ///   - apiId: The API ID.
    ///   - maxResults: The maximum number of results that you want the request to return.
    ///   - typeName: The type name.
    ///   - logger: Logger used for logging
    @inlinable
    public func listResolversPaginator(
        apiId: String,
        maxResults: Int? = nil,
        typeName: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) -> AWSClient.PaginatorSequence<ListResolversRequest, ListResolversResponse> {
        let input = ListResolversRequest(
            apiId: apiId, 
            maxResults: maxResults, 
            typeName: typeName
        )
        return self.listResolversPaginator(input, logger: logger)
    }

    /// Return PaginatorSequence for operation ``listResolversByFunction(_:logger:)``.
    ///
    /// - Parameters:
    ///   - input: Input for operation
    ///   - logger: Logger used for logging
    @inlinable
    public func listResolversByFunctionPaginator(
        _ input: ListResolversByFunctionRequest,
        logger: Logger = AWSClient.loggingDisabled
    ) -> AWSClient.PaginatorSequence<ListResolversByFunctionRequest, ListResolversByFunctionResponse> {
        return .init(
            input: input,
            command: self.listResolversByFunction,
            inputKey: \ListResolversByFunctionRequest.nextToken,
            outputKey: \ListResolversByFunctionResponse.nextToken,
            logger: logger
        )
    }
    /// Return PaginatorSequence for operation ``listResolversByFunction(_:logger:)``.
    ///
    /// - Parameters:
    ///   - apiId: The API ID.
    ///   - functionId: The function ID.
    ///   - maxResults: The maximum number of results that you want the request to return.
    ///   - logger: Logger used for logging
    @inlinable
    public func listResolversByFunctionPaginator(
        apiId: String,
        functionId: String,
        maxResults: Int? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) -> AWSClient.PaginatorSequence<ListResolversByFunctionRequest, ListResolversByFunctionResponse> {
        let input = ListResolversByFunctionRequest(
            apiId: apiId, 
            functionId: functionId, 
            maxResults: maxResults
        )
        return self.listResolversByFunctionPaginator(input, logger: logger)
    }

    /// Return PaginatorSequence for operation ``listSourceApiAssociations(_:logger:)``.
    ///
    /// - Parameters:
    ///   - input: Input for operation
    ///   - logger: Logger used for logging
    @inlinable
    public func listSourceApiAssociationsPaginator(
        _ input: ListSourceApiAssociationsRequest,
        logger: Logger = AWSClient.loggingDisabled
    ) -> AWSClient.PaginatorSequence<ListSourceApiAssociationsRequest, ListSourceApiAssociationsResponse> {
        return .init(
            input: input,
            command: self.listSourceApiAssociations,
            inputKey: \ListSourceApiAssociationsRequest.nextToken,
            outputKey: \ListSourceApiAssociationsResponse.nextToken,
            logger: logger
        )
    }
    /// Return PaginatorSequence for operation ``listSourceApiAssociations(_:logger:)``.
    ///
    /// - Parameters:
    ///   - apiId: The API ID.
    ///   - maxResults: The maximum number of results that you want the request to return.
    ///   - logger: Logger used for logging
    @inlinable
    public func listSourceApiAssociationsPaginator(
        apiId: String,
        maxResults: Int? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) -> AWSClient.PaginatorSequence<ListSourceApiAssociationsRequest, ListSourceApiAssociationsResponse> {
        let input = ListSourceApiAssociationsRequest(
            apiId: apiId, 
            maxResults: maxResults
        )
        return self.listSourceApiAssociationsPaginator(input, logger: logger)
    }

    /// Return PaginatorSequence for operation ``listTypes(_:logger:)``.
    ///
    /// - Parameters:
    ///   - input: Input for operation
    ///   - logger: Logger used for logging
    @inlinable
    public func listTypesPaginator(
        _ input: ListTypesRequest,
        logger: Logger = AWSClient.loggingDisabled
    ) -> AWSClient.PaginatorSequence<ListTypesRequest, ListTypesResponse> {
        return .init(
            input: input,
            command: self.listTypes,
            inputKey: \ListTypesRequest.nextToken,
            outputKey: \ListTypesResponse.nextToken,
            logger: logger
        )
    }
    /// Return PaginatorSequence for operation ``listTypes(_:logger:)``.
    ///
    /// - Parameters:
    ///   - apiId: The API ID.
    ///   - format: The type format: SDL or JSON.
    ///   - maxResults: The maximum number of results that you want the request to return.
    ///   - logger: Logger used for logging
    @inlinable
    public func listTypesPaginator(
        apiId: String,
        format: TypeDefinitionFormat,
        maxResults: Int? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) -> AWSClient.PaginatorSequence<ListTypesRequest, ListTypesResponse> {
        let input = ListTypesRequest(
            apiId: apiId, 
            format: format, 
            maxResults: maxResults
        )
        return self.listTypesPaginator(input, logger: logger)
    }

    /// Return PaginatorSequence for operation ``listTypesByAssociation(_:logger:)``.
    ///
    /// - Parameters:
    ///   - input: Input for operation
    ///   - logger: Logger used for logging
    @inlinable
    public func listTypesByAssociationPaginator(
        _ input: ListTypesByAssociationRequest,
        logger: Logger = AWSClient.loggingDisabled
    ) -> AWSClient.PaginatorSequence<ListTypesByAssociationRequest, ListTypesByAssociationResponse> {
        return .init(
            input: input,
            command: self.listTypesByAssociation,
            inputKey: \ListTypesByAssociationRequest.nextToken,
            outputKey: \ListTypesByAssociationResponse.nextToken,
            logger: logger
        )
    }
    /// Return PaginatorSequence for operation ``listTypesByAssociation(_:logger:)``.
    ///
    /// - Parameters:
    ///   - associationId: The ID generated by the AppSync service for the source API association.
    ///   - format: The format type.
    ///   - maxResults: The maximum number of results that you want the request to return.
    ///   - mergedApiIdentifier: The identifier of the AppSync Merged API. This is generated by the AppSync service. In most cases, Merged APIs (especially in your account) only require the API ID value or ARN of the merged API. However, Merged APIs in other accounts (cross-account use cases) strictly require the full resource ARN of the merged API.
    ///   - logger: Logger used for logging
    @inlinable
    public func listTypesByAssociationPaginator(
        associationId: String,
        format: TypeDefinitionFormat,
        maxResults: Int? = nil,
        mergedApiIdentifier: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) -> AWSClient.PaginatorSequence<ListTypesByAssociationRequest, ListTypesByAssociationResponse> {
        let input = ListTypesByAssociationRequest(
            associationId: associationId, 
            format: format, 
            maxResults: maxResults, 
            mergedApiIdentifier: mergedApiIdentifier
        )
        return self.listTypesByAssociationPaginator(input, logger: logger)
    }
}

extension AppSync.ListApiKeysRequest: AWSPaginateToken {
    @inlinable
    public func usingPaginationToken(_ token: String) -> AppSync.ListApiKeysRequest {
        return .init(
            apiId: self.apiId,
            maxResults: self.maxResults,
            nextToken: token
        )
    }
}

extension AppSync.ListApisRequest: AWSPaginateToken {
    @inlinable
    public func usingPaginationToken(_ token: String) -> AppSync.ListApisRequest {
        return .init(
            maxResults: self.maxResults,
            nextToken: token
        )
    }
}

extension AppSync.ListChannelNamespacesRequest: AWSPaginateToken {
    @inlinable
    public func usingPaginationToken(_ token: String) -> AppSync.ListChannelNamespacesRequest {
        return .init(
            apiId: self.apiId,
            maxResults: self.maxResults,
            nextToken: token
        )
    }
}

extension AppSync.ListDataSourcesRequest: AWSPaginateToken {
    @inlinable
    public func usingPaginationToken(_ token: String) -> AppSync.ListDataSourcesRequest {
        return .init(
            apiId: self.apiId,
            maxResults: self.maxResults,
            nextToken: token
        )
    }
}

extension AppSync.ListDomainNamesRequest: AWSPaginateToken {
    @inlinable
    public func usingPaginationToken(_ token: String) -> AppSync.ListDomainNamesRequest {
        return .init(
            maxResults: self.maxResults,
            nextToken: token
        )
    }
}

extension AppSync.ListFunctionsRequest: AWSPaginateToken {
    @inlinable
    public func usingPaginationToken(_ token: String) -> AppSync.ListFunctionsRequest {
        return .init(
            apiId: self.apiId,
            maxResults: self.maxResults,
            nextToken: token
        )
    }
}

extension AppSync.ListGraphqlApisRequest: AWSPaginateToken {
    @inlinable
    public func usingPaginationToken(_ token: String) -> AppSync.ListGraphqlApisRequest {
        return .init(
            apiType: self.apiType,
            maxResults: self.maxResults,
            nextToken: token,
            owner: self.owner
        )
    }
}

extension AppSync.ListResolversByFunctionRequest: AWSPaginateToken {
    @inlinable
    public func usingPaginationToken(_ token: String) -> AppSync.ListResolversByFunctionRequest {
        return .init(
            apiId: self.apiId,
            functionId: self.functionId,
            maxResults: self.maxResults,
            nextToken: token
        )
    }
}

extension AppSync.ListResolversRequest: AWSPaginateToken {
    @inlinable
    public func usingPaginationToken(_ token: String) -> AppSync.ListResolversRequest {
        return .init(
            apiId: self.apiId,
            maxResults: self.maxResults,
            nextToken: token,
            typeName: self.typeName
        )
    }
}

extension AppSync.ListSourceApiAssociationsRequest: AWSPaginateToken {
    @inlinable
    public func usingPaginationToken(_ token: String) -> AppSync.ListSourceApiAssociationsRequest {
        return .init(
            apiId: self.apiId,
            maxResults: self.maxResults,
            nextToken: token
        )
    }
}

extension AppSync.ListTypesByAssociationRequest: AWSPaginateToken {
    @inlinable
    public func usingPaginationToken(_ token: String) -> AppSync.ListTypesByAssociationRequest {
        return .init(
            associationId: self.associationId,
            format: self.format,
            maxResults: self.maxResults,
            mergedApiIdentifier: self.mergedApiIdentifier,
            nextToken: token
        )
    }
}

extension AppSync.ListTypesRequest: AWSPaginateToken {
    @inlinable
    public func usingPaginationToken(_ token: String) -> AppSync.ListTypesRequest {
        return .init(
            apiId: self.apiId,
            format: self.format,
            maxResults: self.maxResults,
            nextToken: token
        )
    }
}
